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 }