树结构 无根树转有根树

Posted gavanwanggw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树结构 无根树转有根树相关的知识,希望对你有一定的参考价值。

	//输入无根树的结点个数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_百度翻译

vector [英]?vekt?(r) [美]?v?kt?
n. 矢量;航向;[生]带菌者;[天]矢径
vt. 用无线电引导;为…导航


vector是C++标准模板库中的部分内容,中文偶尔译作“容器”。但并不准确。

它是一个多功能的,可以操作多种数据结构和算法的模板类和函数库。vector之所以被觉得是一个容器,是由于它可以像容器一样存放各种类型的对象,简单地说。vector是一个可以存放随意类型的动态数组,可以添加和压缩数据。

以上是关于树结构 无根树转有根树的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯 结点选择

JSOI2012越狱老虎桥

#1542 : 无根数变有根树

有无标号计数

图论小专题B

树的重心