二分图最大匹配

来源:互联网 发布:js syntax error 编辑:程序博客网 时间:2024/06/02 03:03


代码实现是通过(连锁反应)实现的,也叫增广路,每次发现一次增广路配对数就加1.

增广路本质就是一条路径的起点和终点都是未被配对的点。

如果)前匹配方案下再也找不到增广路,(继续对剩下没有被匹配的点一一进行配对,直到所有的点都尝试完毕,找不到新的增广路为止

/*input: 6 51 41 52 52 63 4output: 3*/#include<stdio.h>int e[101][101];int match[101];int book[101];int n,m;int dfs(int u){int i;for(i=1;i<=n;i++){if(book[i]==0&&e[u][i]==1){book[i]=1;//如果点i未被配对或者找到了新的配对 if(match[i]==0||dfs(match[i])){//更新配对关系 match[i]=u;match[u]=i;return 1;}}}return 0;}int main(){int i,j,t1,t2,sum=0;scanf("%d%d",&n,&m);for(i=1;i<=m;i++){scanf("%d%d",&t1,&t2);e[t1][t2]=1;e[t2][t1]=1;}for(i=1;i<=n;i++){for(j=1;j<=n;j++)   book[j]=0;//清空上一次搜索时的标记 if(dfs(i))  sum++;}printf("%d\n",sum);return 0;} 

)那么当前匹配就是最大匹配了。

0 0
原创粉丝点击