(無根樹轉有根樹)吝嗇的國度
阿新 • • 發佈:2018-11-25
一道經典的無根樹轉有根樹模板題。
模板:
#include <iostream> #include <vector> using namespace std; const int MAXN = 1000; int n, p[MAXN]; vector<int> G[MAXN]; //第一種dfs寫法: //不需要對對p進行memset; void dfs(int u, int fa) {//遞迴轉化為以u為根的子樹,u的父親為fa int d = G[u].size(); //節點u的相鄰點的個數 for(int i = 0; i < d; ++i) { //迴圈遍歷跟這個節點相連線的d個節點。 int v = G[u][i]; //節點u的第i個相鄰點v if(fa != v) dfs(v, p[v] = u); //把v的父親節點設為u,然後遞迴轉化為以v為根的子樹 //一定要判斷v是否和其父親節點相等! } } //第二種dfs寫法:用pre代替p; //之前要對pre[maxn] 進行 memset(pre,0,sizeof(pre)); void dfs(int s) { int d=G[u].size(); for(int i=0; i < d;i++) { int v=G[u][i]; if(pre[v]) continue; pre[v]=s; dfs(v); } } int main() { cin >> n; for(int i = 0; i < n-1; i++) { //輸入n-1條邊 int u, v; cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } int root; cin >> root; //指定根節點。 p[root] = -1; //設定根節點的父親節點為-1,代表根節點沒有父親節點。 dfs(root, -1); for(int i = 0; i < n; ++i) { cout << p[i] << endl; } return 0; }
AC程式碼 1 :
#include<cstdio> #include<iostream> #include<vector> #include<cstdio> #include<cstring> using namespace std; const int maxn=100005; int T; int N,s; int p[maxn]; vector<int> G[maxn]; void DFS(int u,int fa) { int d=G[u].size(); for(int i=0;i < d;i++) { int v=G[u][i]; if(p[v]) continue; DFS(v,p[v]=u); } } int main() { cin>>T; while(T--) { for(int i=0;i<maxn;i++) G[i].clear(); memset(p,0,sizeof(p)); cin>>N>>s; int u,v; for(int i=0;i<N-1;i++) { cin>>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? '\n' : ' '); } return 0; }
AC程式碼 2 :
#include<cstdio> #include<vector> #define N 100000+10 using namespace std; vector<int>G[N]; int p[N];//儲存結果 int s,t,n; void read_tree(){ int u,v; scanf("%d%d",&n,&s); 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){ int d = G[u].size(); for(int i=0 ;i<d ;i++){ int v = G[u][i]; if(v!=fa){//遞迴條件 dfs(v,p[v]=u); } } } int main(){ scanf("%d",&t); while(t--){ //多組資料輸入,使用vector之前要clear //否則會run error for(int i=0; i<N; i++) G[i].clear(); read_tree(); p[s] = -1; dfs(s,-1); for(int i=1 ;i<=n ;i++){ printf("%d%c",p[i],i==n?'\n':' '); } } return 0; }