1、无根树转有根树
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define INF 0x7fffffff
#include <vector>
using namespace std;
const int maxn = 1000005;
int p[maxn];
int n;
int root;
vector<int> G[maxn];
void read_tree() { //输入整棵树
int u, v;
scanf("%d", &n);
for(int i = 0; i < n - 1; i++) {
scanf("%d %d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
}
void dfs(int u, int fa) { //递归转化以u为根的子树,u的父亲为fa
int d = G[u].size();
for(int i = 0; i < d; i++) { //结点u的相邻点个数
int v = G[u][i]; //结点u的第i个相邻点v
if(v != fa) dfs(v, p[v] = u); //把v的父亲设为u,然后递归转化以v为根的子树
}
}
int main() {
//freopen("in.txt", "r", stdin);
read_tree();
scanf("%d", &root);
p[root] = -1;
dfs(root, -1);
for(int i = 0; i