在我们遇到的算法题中, ⼀般给出的树结构都是有编号的,这样会简化我们之后存储树的操作 ,⼀般提供两个信息;
- 结点的个数 n;
- 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;
}