C. Graph and String 构造构造构造
根据题目特点,b和所有的其他点相连,能先确定b
确定b后再找到第一个不是b的,赋值为a,或者为c,反正都是对称的
赋完值后,对于所有的点,要么和这个点连,要么不联
联的话如果是b就是b,不是b就只能是a
不联的话只能是c
这样一通构造就能得到一个序列,但不一定保证合法
最后再check一下
:
#include<bits/stdc++.h> using namespace std; int n,m; int e[1000][1000],in[1000]; char s[1000]; int main() { cin>>n>>m; memset(in,0,sizeof(in)); memset(e,0,sizeof(e)); for(int i=1;i<=m;i++) { int l,r; cin>>l>>r; e[l][r]=1; e[r][l]=1; in[r]++; in[l]++; } for(int i=1;i<=n;i++) { if(in[i]==n-1) { s[i]='b'; } } int k=1; while(s[k]=='b'&&k<=n) { k++; } s[k]='a'; for(int i=1;i<=n;i++) { if(i==k) continue; if(in[i]!=n-1&&e[k][i]) { s[i]='a'; } else if(in[i]!=n-1&&!e[k][i]) { s[i]='c'; } } int ok=1; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) { if(i==j) continue; if(e[i][j]==1) { if(s[i]=='a'&&s[j]=='c'||s[i]=='c'&&s[j]=='a') { ok=0; } } else { if(s[i]==s[j]||s[i]=='a'&&s[j]=='b'||s[i]=='b'&&s[j]=='a'||s[i]=='c'&&s[j]=='b'||s[i]=='b'&&s[j]=='c') { ok=0; } } } if(ok) { cout<<"YES"<<endl; for(int i=1;i<=n;i++) { cout<<s[i]; } } else cout<<"NO"; }