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