思路:突破口在发现b必须和其他所有的字符都相连,也就是每个b字符的度数都为n-1,剩下的要么是a要么是c,而a和c又不相连,所以找一个没被染色的顶点,令其是a,除b外,与它相连的都是a,不相连的都是c,最后在遍历一遍看是不是所有的点都符合题目中的关系。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#define max_ 600
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
int n,m;
int mp[max_][max_];
int col[max_];
int deg[max_];
int main(int argc, char const *argv[]) {
cin>>n>>m;
while(m--)
{
int x,y;
cin>>x>>y;
deg[x]++;
deg[y]++;
mp[x][y]=mp[y][x]=1;
}
for(int i=1;i<=n;i++)
{
mp[i][i]=1;
if(deg[i]==n-1)
col[i]=2;
}
for(int i=1;i<=n;i++)
{
if(col[i]==0)
{
col[i]=1;
for(int j=i+1;j<=n;j++)
{
if(col[j]==0)
{
if(mp[i][j])
{
col[j]=1;
}
else
{
col[j]=3;
}
}
}
break;
}
}
int f=0;
for(int i=1;i<=n;i++)
{
if(col[i]==1)
{
for(int j=i;j<=n;j++)
{
if((col[j]==3&&mp[i][j])||(col[j]==1&&mp[i][j]==0))
{
f=1;
break;
}
}
if(f)
break;
}
else if(col[i]==3)
{
for(int j=i;j<=n;j++)
{
if((col[j]==1&&mp[i][j])||(col[j]==3&&mp[i][j]==0))
{
f=1;
break;
}
}
if(f)
break;
}
}
if(f)
{
printf("No\n" );
}
else
{
printf("Yes\n" );
for(int i=1;i<=n;i++)
{
if(col[i]==1)
printf("a" );
else if(col[i]==2)
printf("b" );
else if(col[i]==3)
printf("c" );
}
printf("\n" );
}
return 0;
}