您的位置:首页 > 其它

hdu 2063 过山车【二分图匹配,ver匈牙利

2016-09-28 19:36 393 查看
裸的匈牙利,为什么ACM的读入如此鬼畜233333

被读入卡wa了一次,模板题没有一A,十分不开心23333

#include<bits/stdc++.h>
#define MAXN 1005
using namespace std; int k,n,m;
struct t1{
int to,nxt;
}edge[MAXN<<1]; int cnt_edge=0;
int fst[MAXN];
void addedge(int x,int y){
edge[++cnt_edge].to=y;
edge[cnt_edge].nxt=fst[x];
fst[x]=cnt_edge;
}

int tag[MAXN],vis[MAXN];
int dfs(int now){
if(vis[now]) return 0;
vis[now]=1;
for(int tmp=fst[now];tmp;tmp=edge[tmp].nxt){
if(edge[tmp].to==tag[now]) continue;
int aim=edge[tmp].to;
if(!tag[aim]) return tag[now]=aim,tag[aim]=now,1;
else
if(dfs(tag[aim]))
return tag[now]=aim,tag[aim]=now,1;
}
return 0;
}

void init(){
memset(tag,0,sizeof tag);
memset(fst,0,sizeof fst);
memset(edge,0,sizeof edge);
cnt_edge=0;
}

int read_x,read_y;
int main(){
while((~scanf("%d",&k)&&k!=0)){
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=k;++i)
scanf("%d%d",&read_x,&read_y),addedge(read_x,read_y+n),addedge(read_y+n,read_x);
int nn=m+n;
int ans=0;
for(int i=1;i<=nn;++i){
memset(vis,0,sizeof vis);
if(!tag[i]) ans+=dfs(i);
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: