http://poj.org/problem?id=1422
题意:一个镇上有很多街道,很多十字路口,无循环,把伞兵放在各个十字路口上,使之能把所有的街道都走过,求最小的伞兵数。
最小路径覆盖=节点数-最大匹配。模板题
View Code
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int map[200][200],link[200],vis[200]; 6 int find(int x,int n) 7 { 8 int i,j; 9 for(i = 1; i <= n ;i++) 10 { 11 if(map[x][i]&&!vis[i]) 12 { 13 vis[i] = 1; 14 if(link[i]==0||find(link[i],n)) 15 { 16 link[i] = x; 17 return 1; 18 } 19 } 20 } 21 return 0; 22 } 23 int main() 24 { 25 int i,j,k,n,m,t,a,b; 26 cin>>t; 27 while(t--) 28 { 29 memset(link,0,sizeof(link)); 30 memset(map,0,sizeof(map)); 31 cin>>n>>m; 32 for(i = 1; i <= m ; i++) 33 { 34 cin>>a>>b; 35 map[a][b] = 1; 36 } 37 int sum = 0; 38 for(i = 1; i <= n ; i++) 39 { 40 memset(vis,0,sizeof(vis)); 41 if(find(i,n)) 42 sum++; 43 } 44 cout<<n-sum<<endl; 45 } 46 return 0; 47 }