标签:
二分图染色
b点跟除自身外所有的点连接,共n-1个,首先把连接n-1个的点全部设为b点,其它点任意一点设为a,与a相连的都是a点,剩余为c点。最后验证是否成立。
验证条件为,所有连接的点之间的差值的绝对值不超过1,未连接的点之间的差值的绝对值都大于1.
1 #include<bits/stdc++.h> 2 #include<stdlib.h> 3 #include<math.h> 4 using namespace std; 5 int mp[520][520]; 6 int cnt[520]; 7 int flag[520]; 8 int n,m; 9 int main() 10 { 11 scanf("%d%d",&n,&m); 12 13 for(int i=1;i<=m;i++) 14 { 15 int x,y; 16 scanf("%d%d",&x,&y); 17 mp[x][y]=mp[y][x]=1; 18 cnt[x]++; 19 cnt[y]++; 20 } 21 for(int i=1;i<=n;i++) 22 { 23 if(cnt[i]==n-1) 24 flag[i]=2; 25 26 } 27 int now=0; 28 for(int i=1;i<=n;i++) 29 { 30 if(flag[i]!=2) 31 { 32 now=i; 33 break; 34 } 35 } 36 if(now==0) 37 { 38 printf("Yes\n"); 39 for(int i=1;i<=n;i++) 40 printf("b"); 41 return 0; 42 } 43 44 flag[now]=1; 45 for(int i=1;i<=n;i++) 46 { 47 if(now==i) continue; 48 // if(mp[i][now]) 49 if(!mp[i][now]) flag[i]=3; 50 else if(flag[i]==0) flag[i]=1; 51 } 52 for(int i=1;i<=n;i++) 53 { 54 for(int j=1;j<=n;j++) 55 { 56 if(i==j) continue; 57 if(mp[i][j]) 58 { 59 if(abs(flag[i]-flag[j])>1) 60 return puts("No"); 61 } 62 else 63 { 64 if(abs(flag[i]-flag[j])<=1) 65 return puts("No"); 66 } 67 } 68 } 69 printf("Yes\n"); 70 for(int i=1;i<=n;i++) 71 { 72 if(flag[i]==1) cout<<‘a‘; 73 else if(flag[i]==2) cout<<‘b‘; 74 else cout<<‘c‘; 75 } 76 return 0; 77 78 }
标签:
原文地址:http://www.cnblogs.com/superxuezhazha/p/5187446.html