【树结构】 无根树转有根树

	//输入无根树的结点个数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是一个可以存放随意类型的动态数组,可以添加和压缩数据。

时间: 2024-08-07 23:54:04

【树结构】 无根树转有根树的相关文章

ACM:树的变换,无根树转有根树

题目: 输入一个n个节点的无根树的各条边,并指定一个根节点,要求把该树转化为有根树,输出各个节点的父亲编号. 分析:分析在代码的注释中! #include <iostream> #include <vector> using namespace std; const int MAXN = 1000; int n, p[MAXN]; vector<int> G[MAXN]; void dfs(int u, int fa) { //递归转化为以u为根的子树,u的父亲为fa

无根树转有根树

紫书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(&quo

再谈树---无根树转有根树( dfs搜索转化+fa数组记录父节点) *【模板】

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <vector> #include <algorithm> #define N 100000+2 using namespace std; //无根树转有根树算法 /* 算法分析:所谓无根树,就是根节点任意的树.我们可以给它确定一个根节点. 我们可以假定认为某一个节点为根节点,然后从该节点开始进行dfs或者bfs

SGU - 134 Centroid 无根树转有根树 + 树形DP

题目大意:给出一个无向图(树),要求你删除掉其中一个点,使剩下的点构成的子树中,节点数最大的那个值达到最小 解题思路:因为给出的是一个无根树,第一个想法就是先把它转成有根树,将1当成根 设sum[i]为以i为根节点的子树有多少个节点,那么sum[1] - sum[i]就相当于是排除了i的所有子节点的另一棵子树的节点总数了 设dp[i]为去掉了i节点后的剩余节点所构成的子树的节点的最大值 那么dp[i] = max(dp[i], sum[son]) son指的是和i相连的子节点 还有另一棵子树,就

无根树转有根树的一般方法

紫书:P352 #include <iostream> #include <vector> #include <cstring> using namespace std; int p[100]; vector<int> G[100]; //邻接表 int n; void read_tree() { int u,v; cin>>n; for(int i=0;i<n-1;i++) { cin>>u>>v; //只是告知边

LA 2038 战略游戏(树的动态规划基础题/无根树转有根树/树的最大最小结点集)

题目大意就是求树的最小结点集,树上的动态规划基础题,一次深搜就可以解决问题 代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #i

树的直径、树的重心与树的点分治

树的直径 树的直径(Diameter)是指树上的最长简单路. 直径的求法:两遍搜索 (BFS or DFS) 任选一点w为起点,对树进行搜索,找出离w最远的点u. 以u为起点,再进行搜索,找出离u最远的点v.则u到v的路径长度即为树的直径. 简单证明: 如果w在直径上,那么u一定是直径的一个端点.反证:若u不是端点,则从直径另一端点到w再到u的距离比直径更长,与假设矛盾. 如果w不在直径上,且w到其距最远点u的路径与直径一定有一交点c,那么由上一个证明可知,u是直径的一个端点. 如果w到最远点u

扩增子分析QIIME2分析实战Moving Pictures

本示例的的数据来自文章<Moving pictures of the human microbiome>,Genome Biology 2011,取样来自两个人身体四个部位五个时间点 进入环境 source activate qiime2-2017.6 退出环境 source deactivate 准备数据 # 创建并进入工作目录 mkdir -p qiime2-moving-pictures-tutorialcd qiime2-moving-pictures-tutorial # 下载实验设

2017清北学堂集训笔记——图论

我们进入一个新的模块——图论! emmmmm这个专题更出来可能有点慢别介意,原因是要划的图和要给代码加的注释比较多,更重要的就是...这几个晚上我在追剧!!我们的少年时代超级超级超级好看,剧情很燃啊!!咳咳,好吧下面回归正题. 一.图的存储: 1.邻接矩阵: 假设有n个节点,建立一个n×n的矩阵,第i号节点能到达第j号节点就将[i][j]标记为1(有权值标记为权值), 样例如下图: 1 /*无向图,无权值*/ 2 int a[MAXN][MAXN];//邻接矩阵 3 int x,y;//两座城市