二分图匹配 Hdu1150

来源:互联网 发布:谷歌退出中国 知乎 编辑:程序博客网 时间:2024/06/05 07:29

        注意机器一开始在0_mode下工作,所以一开始就相当于选了0号节点。我们只需跑  残余图的最小顶点覆盖。而这等价于最大匹配。

        算法写的很巧妙,仔细理解。


#include <iostream>#include <cstring>#include <cstdio>using namespace std;int map[105][105],match[105];;bool vis[105];int n,m,k;bool dfs(int i){for (int j=0;j<m;j++){if (!vis[j]&&map[i][j]){vis[j]=true;if (match[j]==-1||dfs(match[j])){match[j]=i;return true;}}}return false;}int Match(){int ret=0;memset(match,-1,sizeof(match));for (int i=0;i<n;i++){memset(vis,false,sizeof(vis));ret+=dfs(i);}return ret;}int main(){int x,t1,t2;while (~scanf("%d",&n),n){scanf("%d%d",&m,&k);memset(map,0,sizeof(map));for (int i=0;i<k;i++){scanf("%d%d%d",&x,&t1,&t2);if (t1>0&&t2>0){map[t1][t2]=1;}}printf("%d\n",Match());}return 0;}


0 0
原创粉丝点击