您的位置:首页 > 其它

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

2015-06-09 19:23 246 查看
//这道是最小点覆盖集的应用

//最小点覆盖,覆盖的是所有的边,而不是所有的点

//在这个题目中,我们的本意是,从所有的模式中选出最少的几个模式来覆盖完全的任务点,但是,这与我们的最小点覆盖却还是区别的

//那么我们应该怎么构图呢?怎么才可以把对点的覆盖转化为对边的覆盖呢?

//我们只需要将能够完成相同任务的点相连就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
;

int used
;

int map

;

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: