hdu2444 二分图匹配(匈牙利算法)

 1 #include<stdio.h>
 2 #include<string.h>
 3 int number[505],dian1[505],dian2[505],y[505],link[505],hash[505];
 4 int f[505][505],g[505][505];
 5 int n1,n2;
 6 int doit(int k)
 7 {
 8     int i;
 9     for (i=1;i<=number[k];i++)
10     {
11         if (hash[f[k][i]]==hash[k]) return(0);
12         if (hash[f[k][i]]==-1){
13             hash[f[k][i]]=1-hash[k];
14             if (doit(f[k][i])==0) return(0);
15         }
16     }
17     return(1);
18 }
19 int find(int x)
20 {
21     int i;
22     for (i=1;i<=n2;i++)
23     if (g[x][dian2[i]]==1&&y[dian2[i]]==0)
24     {
25         y[dian2[i]]=1;
26         if (link[dian2[i]]==0||find(link[dian2[i]]))
27         {
28             link[dian2[i]]=x;
29             return 1;
30         }
31     }
32     return 0;
33 }
34 int main()
35 {
36     int n,m,a,b,i,j,ans,judge;
37     while (~scanf("%d%d",&n,&m))
38     {
39         memset(g,0,sizeof(g));
40         memset(link,0,sizeof(link));
41         memset(number,0,sizeof(number));
42         memset(f,0,sizeof(f));
43         memset(hash,-1,sizeof(hash));
44         for (i=1;i<=m;i++)
45         {
46             scanf("%d%d",&a,&b);
47             g[a][b]=g[b][a]=1;
48         }
49         for (i=1;i<=n;i++)
50          for (j=1;j<=n;j++)
51          if (g[i][j]==1){
52              number[i]++; 
53             f[i][number[i]]=j;
54          }
55         n1=n2=ans=0; judge=1;
56         for (i=1;i<=n;i++)
57         {
58             if (hash[i]==-1) 
59             {
60                 hash[i]=0;
61                 if (doit(i)==0) judge=0;
62             }
63             if (hash[i]==0) {n1++; dian1[n1]=i; }
64             else if (hash[i]==1) {n2++; dian2[n2]=i; }
65         }
66 //        for (i=1;i<=n1;i++) printf("%d ",dian1[i]); printf("\n");
67 //        for (i=1;i<=n2;i++) printf("%d ",dian2[i]); printf("\n");
68         if (judge)
69         for (i=1;i<=n1;i++)
70         {
71             memset(y,0,sizeof(y));
72             if (find(dian1[i])) ans++;
73         }
74         if (n==1||judge==0) printf("No\n");
75         else printf("%d\n",ans);
76     }
77 }
 1 #include<stdio.h>
 2 #include<string.h>
 3 int y[205],link[205],hash[205];
 4 int g[205][205],n;
 5 int doit(int k)
 6 {
 7     int i;
 8     for (i=1;i<=n;i++)
 9     if (g[i][k]==1)
10     {
11         if (hash[i]==0){
12             hash[i]=-hash[k];
13             if (doit(i)==0) return(0);
14         }else
15         if (hash[k]==hash[i]) return(0);
16     }
17     return(1);
18 }
19 int find(int x)
20 {
21     int i;
22     for (i=1;i<=n;i++)
23     if (g[x][i]==1&&y[i]==0)
24     {
25         y[i]=1;
26         if (link[i]==0||find(link[i]))
27         {
28             link[i]=x;
29             return 1;
30         }
31     }
32     return 0;
33 }
34 int main()
35 {
36     int m,a,b,i,j,ans,judge;
37     while (~scanf("%d%d",&n,&m))
38     {
39         memset(g,0,sizeof(g));
40         memset(link,0,sizeof(link));
41         memset(hash,0,sizeof(hash));
42         for (i=1;i<=m;i++)
43         {
44             scanf("%d%d",&a,&b);
45             g[a][b]=g[b][a]=1;
46         }
47         ans=0;
48         hash[1]=1;
49         judge=doit(1);
50         if (judge==0) { printf("No\n");continue;}
51         for (i=1;i<=n;i++)
52         {
53             memset(y,0,sizeof(y));
54             if (find(i)) ans++;
55         }
56         printf("%d\n",ans/2);
57     }
58 }

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

posted on 2014-07-16 15:56  xiao_xin  阅读(125)  评论(0)    收藏  举报

导航