P10298 [CCC 2024 S4] Painting Roads
题解
由易到难,先不考虑交替的事情,既然要尽量少的涂色,那么我最少要涂几条颜色的边?(由于图不一定联通,这里先考虑连通图的情况)
如果一条边处于一个环内,那么这个边就可以不涂色。
所以只要有环我就可以选择一条边不涂色,那么到最后,涂色的边构成一棵树
接下来考虑这颗树能否实现红蓝交替
要满足红蓝交替,则要满足对于任意两点 \(u,v\),\(u \to lca(u,v)\),\(v \to lca(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;
}

浙公网安备 33010602011771号