标签:
加深了我对最小点覆盖的理解
将每个任务的两台机器连线,问题是选取最少的点来覆盖所有的连线,即最小点覆盖
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 }
标签:
原文地址:http://www.cnblogs.com/nicetomeetu/p/5513623.html