您的位置:首页 > 其它

最小顶点数就能覆盖所有边==二分图的最大匹配

2015-05-31 09:51 351 查看
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string.h>       //hdu 1150
#include <queue>        //最小顶点数就能覆盖所有边==二分图的最大匹配
#define N 110
using namespace std;
int a

, use
, vis
;
int n, m;
/*
假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖所有的边。
*/
bool dfs(int x)
{
int t;
for(t=0; t<m; ++t)
{
if(a[x][t]&&!vis[t])
{
vis[t]=1;
if(use[t]==-1||dfs(use[t]))
{
use[t]=x;
return true;
}
}
}
return false;
}
int main()
{
int i, t, j, k, s, T;
while(scanf("%d", &n)&&n)
{
scanf("%d%d", &m, &T);
memset(use, -1, sizeof(use));
memset(a, 0, sizeof(a));
for(i=0; i<T; ++i)
{
scanf("%d %d %d", &k, &j, &t);
if(j==0||t==0)continue;   //注意,如果机器有一边需要0的话则直接continue,因为一开始初始化就是0,先把0的全解决
a[j][t]=1;
}
for(t=s=0; t<n; ++t)
{
memset(vis, 0, sizeof(vis));
if(dfs(t))
s++;
}
printf("%d\n", s);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: