poj1422Air Raid(最小路径覆盖)

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 }

 

posted @ 2013-01-18 18:49  _雨  阅读(187)  评论(0编辑  收藏  举报