树的基本概念,并查集复习(学习记录)
今天主要学习的是树,然后利用题目复习了一下并查集。
树的一些概念词,度,父节点(双亲节点),子节点,树的深度(高度)等等。
二叉树:就是度为2的树
学了前序,中序,后序,简单用代码实现前序(核心我觉得是构建树,在C语言的代码中,就是利用结构体来表示一棵树)
前序,中序,后序的意思也很容易理解
举前序的例子,前序其实就是先 根,再左子树,再右子树。(所以其实前序也被称为先根)
中序:左子树,根,右子树
后序;左子树,右子树,根
下面是今天并查集的复习:
代码的逻辑很清楚,题目思考的步骤也有,便于回顾和复习
P1536 村村通(村村通 - 洛谷)
P1536 村村通
我的思路:
1. 设每条路的端点的门主都是自己
2. 改变现有路的端点的门主,统一门主
3. 查找每个端点的门主是否都是之前统一的门主,如果不是,就+1条路
一把过,稳稳的很安心!
#include<stdio.h>
int pre[100001];
int find(int x) {
if (pre[x] == x) {
return x;
}
return pre[x] = find(pre[x]);
}
int join(int a, int b) {
//找到门主
int fx = find(a);
int fy = find(b);
//统一门主
pre[fx] = fy;
}
int main() {
int n = 0;//城镇
int m = 0;//道路
int a, b = 0;
scanf("%d", &n);
while (n != 0) {
int ans = 0;//还要修几条路
scanf("%d", &m);
//将每条路的门主都设为自己
for (int i = 1; i <= n; i++) {
pre[i] = i;
}
for (int i = 1; i <= m; i++) {
scanf("%d%d", &a, &b);
//将路的端点的门主统一
join(a, b);
}
for (int i = 1; i <= n; i++) {
if (pre[i] == i) {
ans++;
}
}
printf("%d\n", ans - 1);
scanf("%d", &n);
}
return 0;
}