链接:Problem - 1150 (hdu.edu.cn)
问题描述:
问题分析:
这个题可转化成求二分图的最大匹配数,最小覆盖数=最大匹配。用匈牙利算法。
代码实现:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX=110;
bool g[MAX][MAX];
int match[MAX];
bool used[MAX];
int n,m,k;
bool dfs(int x){
for(int i=0;i<m;i++){
if(g[x][i]&&!used[i]){
used[i]=1;
if(match[i]==-1||dfs(match[i])){
match[i]=x;
return true;
}
}
}
return false;
}
int main(){
while(scanf("%d",&n)!=EOF&&n){
int z,x,y,cnt=0;
memset(g,false,sizeof(g));
scanf("%d%d",&m,&k);
for(int i=0;i<k;i++){
cin>>z>>x>>y;
if(x&&y) g[x][y]=true;
}
memset(match,-1,sizeof(match));
for(int i=0;i<n;i++)
{
memset(used,0,sizeof(used));
if(dfs(i))
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}
出现的bug:
int z,x,y,cnt=0;这句话放在循环外面,未重置cnt。。。