题解:P10298 [CCC 2024 S4] Painting Roads
题目穿送门
题目简述
给你一个图,请选出数量最少的边并把它们染色,使得任意两个点有有色路径相连,且路径上的颜色,红色和蓝色交替出现。
题目思路
很显然,选出的边是原图的任意一棵生成树。但是题目不保证道路连通,所以要每个联通图单独考虑。
染色的方法是按照在树上的深度判断,偶数涂红,奇数涂蓝,其余涂灰。
可以拿 map 记录颜色,记录时要考虑有序,不然 \(xy\) 和 \(yx\) 就不是一条边了。
题目代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
const char color[]={'G','R','B'};
vector<int> v[N];
map<pair<int,int>,int> ma;
int n,m,f[N],s[N];
bool vis[N];
void dfs(int x,int deep){
vis[x]=true;//标记
for(int y:v[x]){
if(vis[y]) continue;//判断标记
ma[make_pair(max(x,y),min(x,y))]=(deep&1)+1;//看奇偶性涂色
dfs(y,deep+1);//处理下一个节点
}
}
signed main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
//输入输出加速
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>f[i]>>s[i];
if(f[i]<s[i]) swap(f[i],s[i]);
v[f[i]].push_back(s[i]); v[s[i]].push_back(f[i]);
}
//输入,邻接表建双向边
for(int i=1;i<=n;i++)
if(vis[i]==false) dfs(i,0);
//任意一颗求生成树
for(int i=1;i<=m;i++)
cout<<color[ma[make_pair(f[i],s[i])]];
//输出
return 0;
}.

浙公网安备 33010602011771号