HDU1151 Air Raid

  原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=1151

  DAG图的最小路径覆盖数 = 节点数(n)- 最大匹配数(m)

    所以,关键是求二分图的最大匹配数,上匈牙利就行了。

View Code
 1 #include <iostream>
 2 #include <string.h>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 const int M=120 + 2;
 7 bool g[M][M],visit[M];
 8 int  link[M],m,n,k;
 9 
10 bool find(int i)
11 {
12     int j;
13     for(j=1;j<=n;j++)
14     {
15         if(g[i][j] && !visit[j])
16         {
17             visit[j]=true;
18             if(!link[j] || find(link[j]))
19             {
20                 link[j]=i;
21                 return true;
22             }
23         }
24     }
25     return false;
26 }
27 
28 int main()
29 {
30     int i,j,res,T;
31     cin >> T;
32     while(T --)
33     {
34         cin >> n >> m;
35         memset(g,false,sizeof(g));
36         memset(link,false,sizeof(link));
37         for(int k = 0; k < m; k ++)
38         {
39             cin>>i>>j;
40             g[i][j]=true;
41         }
42         for(res=0,i=1;i<=n;i++)
43         {
44             memset(visit,0,sizeof(visit));
45             if(find(i))
46                 res++;
47         }
48         cout<<n-res<<endl;
49     }
50     return 0;
51 }

 

 

  

posted @ 2012-11-24 13:23  芒果布丁  阅读(162)  评论(0编辑  收藏  举报