题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1151
求最小路径覆盖
二分图最小路径覆盖=点的个数-最大匹配。
代码:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 #define maxn 125 7 int g[maxn][maxn]; 8 int vis[maxn]; 9 int cx[maxn]; 10 int cy[maxn]; 11 int n; 12 int m; 13 int ans; 14 int path(int u) 15 { 16 17 vis[u]=1; 18 for(int v=1;v<=n;v++) 19 { 20 if(vis[v]==0 && g[u][v]!=0) 21 { 22 vis[v]=1; 23 24 if(cy[v]==-1 || path(cy[v])) 25 { 26 cx[u]=v; 27 cy[v]=u; 28 return 1; 29 } 30 } 31 } 32 return 0; 33 } 34 void MaxMatch() 35 { 36 memset(cx,-1,sizeof(cx)); 37 memset(cy,-1,sizeof(cy)); 38 39 for(int i=1;i<=n;i++) 40 { 41 if(cx[i]==-1) 42 { 43 44 memset(vis,0,sizeof(vis)); 45 ans+=path(i); 46 } 47 } 48 } 49 int main() 50 { 51 int t; 52 scanf("%d",&t); 53 while(t--) 54 { 55 ans=0; 56 scanf("%d",&n); 57 scanf("%d",&m); 58 memset(g,0,sizeof(g)); 59 int s,e; 60 for(int i=0;i<m;i++) 61 { 62 scanf("%d%d", &s,&e); 63 g[s][e]=1; 64 } 65 MaxMatch(); 66 cout<<n-ans<<endl; 67 68 69 } 70 return 0; 71 }