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";
}

 

posted @ 2021-11-17 08:01  liyishui  阅读(37)  评论(0编辑  收藏  举报