【Henu ACM Round#16 C】Graph and String

【链接】 我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


根据题意:先明确以下规则:
1.如果两个点之间没有边,那么这两个点只能是a或c,且不能相同
2.如果两个点之间有边,那么他们之间的差的绝对值<=1

那么对于点i,如果它和所有的点都相连了,那么就干脆把他变成b.
这样其他点无论选什么都和它没有关系,其他点选什么都可以了

接下里,找到任意一个点j,且点j没有和所有的点相连。
显然这个点只能为a或c,因为它和某个点之间没有边。【规则1】

那么我们就让这个点j设置为a;

①然后对于和j相连的所有点k,且点k不为b(即k不与其他所有点相连),那么点k
只能为a或c(因为k和某个点之间没有边)【规则1】
而根据【规则2】可知点k只能为a

②对于和j不相连的所有点k,显然k只能为c

根据①和②
会发现所有的点都已经染上色了
而点j为a或c其实不影响答案。

所以再O(n^2)根据规则判断一下这个染色是否可行就好了。

【代码】

#include <bits/stdc++.h>
using namespace std;

const int N = 500+10;

int c[N],n,m,chu[N+10];
bool b[N][N];

int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    #ifdef LOCAL_DEFINE
        freopen("rush.txt","r",stdin);
    #endif

    cin >> n >> m;
    for (int i = 1;i <= m;i++){
        int x,y;
        cin >> x >> y;
        b[x][y] = b[y][x] = true;
        chu[x]++;chu[y]++;
    }

    for (int i = 1;i <= n;i++)
        if (chu[i]==(n-1))
            c[i] = 2;

    for (int i = 1;i <= n;i++)
        if (c[i]!=2){
            c[i] = 1;
            for (int j = 1;j <= n;j++)
                if (b[i][j] && c[j]!=2){
                    c[j] = 1;
                }else if (i!=j && !b[i][j]){
                    c[j] = 3;
                }
            break;
        }

    for (int i = 1;i <= n;i++)
        for (int j = 1;j <= n;j++)
            if (b[i][j]){
                if (abs(c[i]-c[j])>1) return cout<<"No"<<endl,0;
            }else if (i!=j){
                if (abs(c[i]-c[j])<=1) return cout<<"No"<<endl,0;
            }
    cout<<"Yes"<<endl;
    for (int i = 1;i <= n;i++){
        if (c[i]==1) cout<<'a';
        if (c[i]==2) cout<<'b';
        if (c[i]==3) cout<<'c';
    }
    return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/8358933.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值