0
点赞
收藏
分享

微信扫一扫

hdu1150 Machine Schedule 匈牙利算法 最小点覆盖=最大值匹配

Separes 2022-06-29 阅读 41

​​传送门​​​ 思路:
最小点覆盖=最大值匹配
hdu1150 Machine Schedule 匈牙利算法 最小点覆盖=最大值匹配_#define
红色标记的继为最小点覆盖,每条边代表每台机器。我们发现只要三个点,就能覆盖所有机器。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define maxn 1010
#define InF 0x3f3f3f3f
using namespace std;
int G[maxn][maxn], used[maxn], vis[maxn], n;
bool Find(int u) {
int i;
for(i = 1 ; i <= n ; i++) {
if(!vis[i] && G[u][i]) {
///vis[i]表示i男生还没有被别的女生选走
vis[i] = 1;
if(!used[i] || Find(used[i])) {
///如果女生used[i]没有选男生i作伴或者女生used[i]选了男生i,她放弃男生i并且另外找到了自己的伴
///当前还可以挪出来位置
used[i] = u;///就让男生i与女生u作伴
return true;
}
}
}
return false;
}///该函数判断女生能不能找到伴
int main() {
int k, m, i, a, b, ans;
while(cin>>n>>m>>k){
ans = 0;
mem(G, 0);
while(k--) {
int x;
scanf("%d%d%d",&x, &a, &b);
G[a][b] = 1;///G[a][b]表示女生a愿意与男生b作伴
}///used[i]表示i男生与used[i]女生作伴
mem(used, 0);
for(i = 1 ; i <= m ; i++) {
mem(vis, 0);
if(Find(i))
ans++;
}
printf("%d\n", ans);
}
//int zero;
//cin>>zero;
return 0;
}


举报

相关推荐

0 条评论