codeforces 624C 二分图染色

来源:互联网 发布:js array index 编辑:程序博客网 时间:2024/05/22 03:43

点击打开链接

//b和a,c都相连 不相连的只有a-c 所以原图中的两点无边只能为a-c 

//在补图中确定颜色法案后,还要在原图中check一遍

#include <set>#include <map>#include <queue>#include <stack>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;const int N =5e2+20;int n,m;vector<int> e[N];//补图的边 相邻两点为a-c //b和a,c都相连 不相连的只有a-c 所以原图中的两点无边则为a-c int g[N][N]; int vis[N];bool flag=true;void input(){cin>>n>>m;for(int i=1;i<=n;i++)vis[i]=-1; memset(g,0,sizeof(g)); for(int i=1;i<=m;i++){int u,v;cin>>u>>v;g[u][v]=g[v][u]=1;}for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){if(g[i][j]==0){e[i].push_back(j);e[j].push_back(i);}}}}void dfs(int u,int f){if(!flag)return;if(e[u].size()==0)//breturn;if(f==-1)//2分图染色 第一次任意一个点染a即可 {vis[u]=1;}else{ if(vis[u]==-1) { vis[u]=f;}else if(vis[u]!=f)//已经染色的矛盾 {flag=0;return;}else//不重复染色 return;}for(int i=0;i<e[u].size();i++)dfs(e[u][i],1-vis[u]);// 1-vis[u]相反颜色 }void solve(){for(int i=1;i<=n;i++){if(vis[i]==-1){dfs(i,-1);if(!flag){cout<<"No"<<endl;return;}}}for (int i = 1; i <= n; i++)  //最后要在原图check一遍     {          for (int j = 1; j <= n; j++)          {              if (i == j)continue;              if (g[i][j] == 1)              {                  if (vis[i] == -1 || vis[j] == -1)continue;                  if (abs(vis[i] - vis[j]) == 1)                  {                      puts("No");                      return;                  }              }          }      }  cout<<"Yes"<<endl;for(int i=1;i<=n;i++){if(vis[i]==-1)//没有在补图中染色的为b(在补图中无边) cout<<'b';else if(vis[i]==1)cout<<'a';elsecout<<'c';}cout<<endl;}int main(){input();solve();    return 0;}


0 0
原创粉丝点击