HDU 1150 - Machine Schedule

加深了我对最小点覆盖的理解
将每个任务的两台机器连线,问题是选取最少的点来覆盖所有的连线,即最小点覆盖

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <vector>
 5 using namespace std;
 6 const int maxn=105;
 7 vector<int>map[105];
 8 int link[maxn],vis[maxn];
 9 int n,m,k;
10 bool dfs(int t)
11 {
12     int i,x,size=map[t].size();
13     for(i=0;i<size;i++)
14     {
15         x=map[t][i];
16         if(!vis[x])
17         {
18             vis[x]=1;
19             if(link[x]==-1||dfs(link[x]))
20             {
21                 link[x]=t;
22                 return 1;
23             }
24         }
25     }
26     return 0;
27 }
28 int main()
29 {
30     int i,a,b,c;
31     while(~scanf("%d",&n)&&n)
32     {
33         scanf("%d%d",&m,&k);
34         for(i=1;i<=n;i++) map[i].clear();
35         for(i=0;i<k;i++)
36         {
37             scanf("%d%d%d",&a,&b,&c);
38             if(b&&c) map[b].push_back(c);
39         }
40         memset(link,-1,sizeof(link));
41         int ans=0;
42         for(i=1;i<=n;i++)
43         {
44             memset(vis,0,sizeof(vis));
45             if(dfs(i)) ans++;
46         }
47         printf("%d\n",ans);
48     }
49 }

 

posted @ 2016-05-20 22:33  nicetomeetu  阅读(153)  评论(0编辑  收藏  举报