P8186 [USACO22FEB] Redistributing Gifts S 题解
题意简述
题目描述的是农夫约翰有
解题思路
不难想到建图,每个奶牛和可以得到的礼物连边。
考虑贪心,对于每个奶牛
注意到,使用匈牙利算法匹配左部点
考虑优化,不难发现若对每个奶牛
显然,该二分图必然存在完美匹配,因为将所有奶牛
i 和礼物i 匹配就是完美匹配。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500;
vector<int> edge[N+2];
int p[N+2],q[N+2];
bool vis[N+2];
bool match(int x){
for(int i:edge[x]) if(!vis[i]){
vis[i]=1;
if(p[i]==0||match(p[i])){
p[i]=x;
q[x]=i;
return 1;
}
}
return 0;
}
int main(){
// freopen("data.in","r",stdin);
cin.tie(0)->sync_with_stdio(0);
int n;
cin>>n;
for(int i=1;i<=n;i++){
bool flag=1;
for(int j=1;j<=n;j++){
int x;
cin>>x;
if(flag){
edge[i].push_back(x);
}
if(x==i){
flag=0;
}
}
}
//二分图匹配?
for(int i=1;i<=n;i++){
memset(vis,0,sizeof vis);
match(i);
}
for(int i=1;i<=n;i++){
q[i]=p[q[i]]=0;
memset(vis,0,sizeof vis);
match(i);
cout<<q[i]<<"\n";
}
// cout<<"\n";
return 0;
}