1. 程式人生 > >【樹結構】 無根樹轉有根樹

【樹結構】 無根樹轉有根樹



	//輸入無根樹的結點個數n,輸入n-1條邊(u, v),輸入欲指定的根的編號root,建立以root為根的樹
	/*可變長陣列 一個有maxn行 當時每行長度可以不同的陣列
	  用於表示樹中結點間的關係 
	                                                    */ 
	#include<stdio.h>
	#include<stdlib.h>
	#include<string.h>
	#include<vector> 
	#include<queue>
	using namespace std;
	const int maxn = 1000;

	vector<int> G[maxn]; //STL中的可變長陣列 
	int n, root, p[maxn];
	
	void dfs(int u, int fa) //遞迴轉化以U為根的子樹, U的父親為fa 
	{
	    int d = G[u].size();
	    for(int i = 0; i < d; i++)
	    {
	        const int& v = G[u][i];
	        if(v != fa) 
			  dfs(v, p[v] = u);
	    }
	}            
	
	int main()
	{
	    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);
	    }
	    scanf("%d", &root);
	    p[root] = -1;
	    dfs(root, -1);
	    for(int i = 0; i < n; ++i) 
		   printf("p[%d] = %d\n", i, p[i]);
	    return 0;
	}    
	        
/*
  輸出格式  p[該節點] =  該節點父親
  例如 p[5] = 1; 結點5的父親是1; 
  當該節點為根節點 則對應的為-1 
*/ 
vector [英]ˈvektə(r) [美]ˈvɛktɚ
n. 向量;航向;[生]帶菌者;[天]矢徑
vt. 用無線電引導;為…導航

vector是C++標準模板庫中的部分內容,中文偶爾譯作“容器”,但並不準確。它是一個多功能的,能夠操作多種資料結構和演算法的模板類和函式庫。vector之所以被認為是一個容器,是因為它能夠像容器一樣存放各種型別的物件,簡單地說,vector是一個能夠存放任意型別的動態陣列,能夠增加和壓縮資料。