小紫每次可以移动1或者2,我们可以认为他每次移动2次,然后记录每个点最早被小紫访问时间,这个点可以被小红访问只有两种情况,
1,不是叶子节点,那么小紫到达时间必须严格晚于小红;
2,是叶子节点,那么小紫到达时间晚于或等于小红;(因为小红到达了就结束了)
注意,在实现的时候,可以bfs小紫,然后dis 除2向上取整
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int MOD = 998244353, INF = 1e18;
void solve()
{
int n, a, b;
cin >> n >> a >> b;
vector adj(n + 1, vector<int>());
for (int i = 0, u, v; i < n - 1; i++)
{
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> dist1(n + 1, INF);
dist1[b] = 0;
queue<int> q;
q.push(b);
while (q.size())
{
auto u = q.front();
q.pop();
for (auto v: adj[u])
{
if (dist1[v] == INF)
{
dist1[v] = dist1[u] + 1;
q.push(v);
}
}
}
for (int i = 1; i <= n; i++)
{
dist1[i] = (dist1[i] + 1) / 2;
}
vector<int> dist2(n + 1, INF);
dist2[a] = 0;
q.push(a);
while (q.size())
{
auto u = q.front();
q.pop();
int timer = dist2[u] + 1;
for (auto v: adj[u])
{
if ((dist2[v] == INF) && (dist1[v] > timer || (dist1[v] == timer && (adj[v].size() == 1))))
{
dist2[v] = dist2[u] + 1;
q.push(v);
}
}
}
for (int i = 1;i <= n;i++)
{
if (adj[i].size() == 1)
{
if (dist2[i] != INF)
{
cout << "red\n";
return;
}
}
}
cout << "purple\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int testcase = 1;
cin >> testcase;
while (testcase--)
{
solve();
}
return 0;
}

京公网安备 11010502036488号