Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=2444

View Code
 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 }

 

posted on 2012-04-19 20:55  Qiuqiqiu  阅读(161)  评论(0编辑  收藏  举报