题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063
二分图匹配,匈牙利
贴代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=505,maxe=1005;
int son[maxe*2],nxt[maxe*2];
int link[maxn*2],check[maxn*2];
bool vis[maxn*2];
int n,m,k,tot;
void add(int x,int y){
son[++tot]=y;nxt[tot]=link[x];link[x]=tot;
}
bool dfs(int x){
for (int j=link[x];j!=0;j=nxt[j]){
if (!vis[son[j]]){
vis[son[j]]=true;
if ((check[son[j]]==-1)||(dfs(check[son[j]]))){
check[son[j]]=x;
check[x]=son[j];
return 1;
}
}
}
return 0;
}
int main(){
// freopen("2063.in","r",stdin);
// freopen("2063.out","w",stdout);
scanf("%d",&k);
while (k!=0){
memset(check,-1,sizeof(check));
memset(link,0,sizeof(link));
scanf("%d%d\n",&n,&m);
tot=0;
for (int i=1;i<=k;i++){
int x,y;
scanf("%d%d\n",&x,&y);
add(x,y+n);add(y+n,x);
}
int ans=0;
for (int i=1;i<=n;i++){
if (check[i]==-1){
memset(vis,0,sizeof(vis));
if (dfs(i))ans++;
}
}
printf("%d\n",ans);
scanf("%d",&k);
}
return 0;
}
【写的有漏洞的,欢迎路过大神吐槽】
2017/07/16 15:27:12
Ending.