hdu1150 最小点覆盖集的一个小小的变形

//这道是最小点覆盖集的应用
//最小点覆盖,覆盖的是所有的边,而不是所有的点
//在这个题目中,我们的本意是,从所有的模式中选出最少的几个模式来覆盖完全的任务点,但是,这与我们的最小点覆盖却还是区别的
//那么我们应该怎么构图呢?怎么才可以把对点的覆盖转化为对边的覆盖呢?
//我们只需要将能够完成相同任务的点相连就ok了,如果这些边都已经全部覆盖了的话,那么所有的任务也就一定要被覆盖。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <list>
#include <limits.h>
using namespace std;
#define N 110
#define maxdata 1000000
int match[N];
int used[N];
int map[N][N];
int ans  =0;
int m,n,k,l;
int dfs(int x ,int l)
{
for(int i =  1 ;i<=l;i++)
{
if(map[x][i]==1&&used[i]==0)
{
used[i]=1;
if(match[i]==-1||dfs(match[i],l)==1)
{
match[i]=x;
return 1 ;
}
}
}
return 0 ;
}
int main()
{
while(scanf("%d",&m)&&m>0)
{
ans = 0 ;
memset(map,0,sizeof(map));
memset(match,-1,sizeof(match));
scanf("%d%d",&n,&k);
while(k--)
{
int x ,y  ;
scanf("%d%d%d",&l,&x,&y);
map[x][y]=1;
}
l = m>n? m :n;
for(int i = 1 ;i<=m;i++)
{
memset(used,0,sizeof(used));
if(dfs(i,l)==1) ans++;
}
printf("%d\n",ans);
}
return 0;
}

你可能感兴趣的:(Algorithm,DFS,匈牙利算法,最小点覆盖变型)