裸的匈牙利,为什么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;
}

本文通过一个具体的模板题目介绍了裸的匈牙利算法的实现细节,包括数据结构定义、边的添加、深度优先搜索匹配等核心步骤,并提供了一个完整的C++代码示例。
6万+

被折叠的 条评论
为什么被折叠?



