紫书P352
无根树转有根树,如果节点数n<=10^6,那么邻接矩阵就见不了了。用vector数组,vector数组实际占用空间与n成正比。
#include <stdio.h> #include <vector> using namespace std; #define MAXN 1000010 vector<int> G[MAXN]; int n; //n个点,n-1条边 int p[MAXN]; void Build_Tree () { scanf("%d",&n); for(int i=0;i<n-1;i++) { int u,v; 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() { freopen("input.txt","r",stdin); Build_Tree(); dfs(1,-1); p[1] = -1; for(int i=0;i<n;i++) printf("%d ",p[i]); puts(""); return 0; }
p[root] = -1;
记得一定要v和父节点相等,如果忽略,就会引起无限递归。