题解: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;
}.
posted @ 2025-04-18 14:37  _Charllote  阅读(58)  评论(0)    收藏  举报