http://acm.hdu.edu.cn/showproblem.php?pid=2444
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=210; 6 int set[N],g[N][N],n; 7 bool flag; 8 int mat[N],vis[N]; 9 void dfs(int u,int c) 10 { 11 if(!flag) return; 12 for(int v=1;v<=n;v++) if(g[u][v]) 13 { 14 if(set[v]!=0 && set[v]!=c) flag=0; 15 if(set[v]==0) 16 { 17 set[v]=c; 18 dfs(v,-c); 19 } 20 } 21 } 22 bool find(int u) 23 { 24 for(int v=1;v<=n;v++) 25 if(g[u][v] && !vis[v]) 26 { 27 vis[v]=1; 28 if(mat[v]==-1 || find(mat[v])) 29 { 30 mat[v]=u; 31 return 1; 32 } 33 } 34 return 0; 35 } 36 int maxmatch() 37 { 38 int cnt=0; 39 memset(mat,-1,sizeof(mat)); 40 for(int i=1;i<=n;i++) 41 { 42 memset(vis,0,sizeof(vis)); 43 if(find(i)) cnt++; 44 } 45 return cnt; 46 } 47 int main() 48 { 49 int m; 50 while(~scanf("%d%d",&n,&m)) 51 { 52 memset(g,0,sizeof(g)); 53 memset(set,0,sizeof(set)); 54 for(int i=0;i<m;i++) 55 { 56 int u,v; 57 scanf("%d%d",&u,&v); 58 g[u][v]=1; 59 } 60 flag=1; 61 for(int i=1;i<=n;i++) if(!set[i]) 62 { 63 set[i]=-1; 64 dfs(i,1); 65 if(!flag) break; 66 } 67 if(!flag) {printf("No\n"); continue;} 68 int ans=maxmatch(); 69 printf("%d\n",ans); 70 } 71 return 0; 72 }