在我们遇到的算法题中, ⼀般给出的树结构都是有编号的,这样会简化我们之后存储树的操作 ,⼀般提供两个信息;

  1. 结点的个数 n;
  2. n-1条x结点与y结点相连的边

题⽬描述:

⼀共9个结点셈 1号结点为根节点,接下来8⾏,每⾏两个数x, y, 表示x, y之间有⼀条边

输⼊格式:

9

3 1

1 2

4 1

2 5

6 2

7 4

4 8

4 9

我们观察下,它告诉我们两个数的时候,⽐如3 1之间有⼀条边,并没有告诉我们谁是⽗结点谁是孩⼦结点,虽然这道题⾥⾯我们知道1是根结点,1就是⽗亲,3就是孩⼦,但是它每⾏告诉我们的顺序并没有⽗⼦关系,在看第5⾏的2 5,并不知道2是⽗亲还是5是⽗亲,所以这道题虽然告知了根结点,但是还是要当作⽆根数处理,因为我们基本上是看不出⽗⼦关系的。

接下来我们⽤vector数组来实现孩⼦表示法

1.创建⼀个⼤⼩⾜够的vector数组,vector<int> edges[10];(注意这⾥是[]不是(),如果是(),相当于你创建了⼀个vector数组且⾥⾯的空间为10,但是你写成[],相当于我们创建了10个vector数组)其中 edges[i]⾥⾯就存着i号结点的所有孩⼦

2.对于i的孩⼦,直接edges[i].push_back

我们⽤图像来表示上⾯的话,模拟⼀下把左边的逻辑结构存到edges数组⾥⾯(⽐如3号下标⾥⾯的 vector数组,它以后要存储6号结点的孩⼦信息)

#include<iostream>
#include <vector>
using namespace std;

const int N = 1e5 + 10;
int n;
vector<int> edges[N]; //´æ´¢Ê÷

int main()
{
	cin >> n;
	for (int i = 1; i <= n; ++i)
	{
		int a, b; cin >> a >> b;
		edges[a].push_back(b);
		edges[b].push_back(a);
	}

	return 0;
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐