P10298 [CCC 2024 S4] Painting Roads

原题链接

题解

由易到难,先不考虑交替的事情,既然要尽量少的涂色,那么我最少要涂几条颜色的边?(由于图不一定联通,这里先考虑连通图的情况)

如果一条边处于一个环内,那么这个边就可以不涂色。
所以只要有环我就可以选择一条边不涂色,那么到最后,涂色的边构成一棵树

接下来考虑这颗树能否实现红蓝交替
要满足红蓝交替,则要满足对于任意两点 u,vulca(u,v)vlca(u,v) 的边是交替的,且 lca(u,v) 通向两点的第一条边颜色不同
满足前半个条件很简单,按深度奇偶性涂色
一条灰色边对应一个环,无向图dfs生成树一定满足上述限制,即生成树中上述情况不可能存在

code

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

struct node
{
    int id,to;
};
vector<node> G[200005];
int ans[200005];
int vis[200005]={0};
void dfs(int now,int color)
{
    vis[now]=1;
    for(auto next:G[now])
    {
        int id=next.id,to=next.to;
        if(vis[to]) continue;

        ans[id]=color;
        dfs(to,color^1);
    }
}
int main()
{
    memset(ans,-1,sizeof ans);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        G[x].push_back({i,y});
        G[y].push_back({i,x});
    }

    for(int i=1;i<=n;i++)
    {
        if(!vis[i]) dfs(i,1);
    }

    for(int i=1;i<=m;i++)
    if(ans[i]==-1) printf("G");
    else if(ans[i]==0) printf("B");
    else printf("R");
    return 0;
}

posted @   纯粹的  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示