无根树转有根树

无根树转有根树

紫书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;
}
原文地址:https://www.cnblogs.com/s1124yy/p/6000625.html