http://acm.hdu.edu.cn/showproblem.php?pid=1151
DAG图的最小路径覆盖数=节点数-最大匹配数
View Code
1 //1151 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int N=150; 7 int g[N][N],n; 8 int mat[N],vis[N]; 9 bool find(int u) 10 { 11 for(int v=1;v<=n;v++) 12 if(g[u][v] && !vis[v]) 13 { 14 vis[v]=1; 15 if(mat[v]==-1 || find(mat[v])) 16 { 17 mat[v]=u; 18 return 1; 19 } 20 } 21 return 0; 22 } 23 int maxmatch() 24 { 25 int cnt=0; 26 memset(mat,-1,sizeof(mat)); 27 for(int i=1;i<=n;i++) 28 { 29 memset(vis,0,sizeof(vis)); 30 if(find(i)) cnt++; 31 } 32 return cnt; 33 } 34 int main() 35 { 36 int T; 37 scanf("%d",&T); 38 while(T--) 39 { 40 memset(g,0,sizeof(g)); 41 int m; 42 scanf("%d%d",&n,&m); 43 for(int i=0;i<m;i++) 44 { 45 int u,v; 46 scanf("%d%d",&u,&v); 47 g[u][v]=1; 48 } 49 int ans=n-maxmatch(); 50 printf("%d\n",ans); 51 } 52 }