西安之泪 题解
由于最终每个点
考虑点
- 对每个邻居
v_i 执行操作(v_i, u) 。这是因为以v_i 为根时,u 的子树包含u 以及所有不在v_i 另一侧子树内的节点。 - 如果
d 是偶数,需要额外执行一次(u, u) 。这是因为以u 为根时,u 的子树就是整棵树。
上述策略的正确性可以通过计算任意节点
下面对操作数的上界进行验证。不妨记
按上述构造直接输出即可,时间复杂度
#include <bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
vector<vector<int> > adj(n+1);
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<pii> ops;
for(int i=1;i<=n;i++)
{
for(auto v:adj[i]) ops.emplace_back(v,i);
if(adj[i].size()%2==0) ops.emplace_back(i,i);
}
cout<<ops.size()<<'\n';
for(auto [r,u]:ops){
cout<<r<<' '<<u<<'\n';
}
}
return 0;
}