无根树转有根树
紫书P352
【题目链接】http://acm.nyist.net/JudgeOnline/problem.php?pid=20
【题目类型】树
&题解:
南阳理工的oj不能用ifndef,坑了我半小时,为啥总是T呢? 尼玛要关重定向。
这其实就是简单的邻接表+dfs,dfs的两个参数比较重要,要仔细理解,第一个是一h为根,第二个是h的父亲。
时间复杂度应该是n吧,因为每个只扫了一遍,就是2×n。我也不知道这个对不对,如果你觉得错了,可以评论,我会改的。
【时间复杂度】O((n))
&代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
#define cle(a,val) memset(a,(val),sizeof(a))
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d %d",&(N),&(M))
#define SIII(N,M,K) scanf("%d %d %d",&(N),&(M),&(K))
#define rep(i,b) for(int i=0;i<(b);i++)
#define rez(i,a,b) for(int i=(a);i<=(b);i++)
#define red(i,a,b) for(int i=(a);i>=(b);i--)
const ll LINF = 0x3f3f3f3f3f3f3f3f;
#define PU(x) puts(#x);
#define PI(A) cout<<(A)<<endl;
#define DG(x) cout<<#x<<"="<<(x)<<endl;
#define DGG(x,y) cout<<#x<<"="<<(x)<<" "<<#y<<"="<<(y)<<endl;
#define DGGG(x,y,z) cout<<#x<<"="<<(x)<<" "<<#y<<"="<<(y)<<" "<<#z<<"="<<(z)<<endl;
#define PIar(a,n) rep(i,n)cout<<a[i]<<" ";cout<<endl;
#define PIarr(a,n,m) rep(aa,n){rep(bb, m)cout<<a[aa][bb]<<" ";cout<<endl;}
const double EPS = 1e-9 ;
/* //////////////////////// C o d i n g S p a c e //////////////////////// */
const int MAXN = 100000 + 9 ;
int N,S,u,v,p[MAXN];
vector<int> G[MAXN];
void dfs(int h,int fa){
int d=G[h].size();
for(int i=0;i<d;i++){
int t=G[h][i];
if (t!=fa) dfs(t,p[t]=h);
}
}
void Solve()
{
SII(N,S);
rep(i,MAXN) G[i].clear();
rep(i,N-1){
SII(u,v);
G[u].push_back(v);
G[v].push_back(u);
}
p[S]=-1;
dfs(S,-1);
for(int i=1;i<=N;i++) printf("%d%c",p[i],i==N?'
':' ');
}
int main()
{
int T;SI(T);while(T--)
Solve();
return 0;
}