其他5题题解@羚羊向未来
重现赛链接:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
补题链接:
牛客给的题解
【题解】2023年第六届传智杯初赛题解_讨论帖_牛客网 (nowcoder.com)
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const ll N = 1e6 + 20;
#define rep(i,a,b) for(ll i=a;i<=b;i++)
ll color[N];
ll w[N];
ll h[N], e[N], ne[N], idx;
void add(ll a, ll b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
ll n;//节点个数
ll ans=0;
//1 红 -1蓝
void dfs(ll now,ll p) {
if (now > n ) {
return ;
}
//遍历子节点,对于一个任意节点,有且仅有一个节点与其同色
//推出:叶子节点一定与父节点同色
//dfs回溯正好实现先找到叶子节点再返回父节点
//即后序遍历可以保证配对不出错
for (ll i = h[now]; i != -1; i = ne[i]) {
ll j = e[i];
if(j==p)
continue;
dfs(j,now);
//子节点没有匹配
if (color[j] == 0) {
if (color[now] == 0) {
color[now] = j;
color[j] = now;
}
//父节点已经有配对的子节点了
else {
ans = -1;
return ;
}
}
}
return ;
}
//改色
void dfs2(ll now,ll p) {
if (now > n ) {
return ;
}
//遍历子节点,贪心染色,只有配对的节点同色,其他的不同色
for (ll i = h[now]; i != -1; i = ne[i]) {
ll j = e[i];
if(j==p)
continue;
if (j == color[now])
w[j] = w[now];
else
w[j] = -w[now];
dfs2(j,now);
}
return ;
}
int main() {
memset(h, -1, sizeof h);
cin >> n;
ll a, b;
rep(i, 1, n - 1) {
cin >> a >> b;
//双向建边!!!!!!,题目不保证始终是父节点指向子节点
add(a,b);
add(b,a);
}
dfs(1,0);
//根节点还有没有判断是否有配对的
if(color[1]==0)
ans=-1;
if(ans==-1){
cout<<-1;
return 0;
}
//染色
w[1] = 1;
dfs2(1,0);
rep(i, 1, n) {
if (w[i] == 1) {
cout << "R";
} else {
cout << "B";
}
}
return 0;
}