tips:树是一种特殊的图 是无环连通图

有向图边有方向 如a->b
无向图边没有方向 a<->b
无向图是特殊的有向图 我们就先理解有向图的储存

1.邻接矩阵 其实就是一个二维数组 g[a][b]就存储a->b 有权重就是权重 没有就是bool值表示有无边 邻接矩阵不能有重边 只能保留一条 这个比较浪费空间

2.邻接表 就是n个节点 每个都开单链表 就跟哈希拉链法一样

[树的存储] [c++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
using namespace std;

const int N=10010,M=N*2;

int h[N],e[N],ne[N]; //h链表头 e节点的值 ne指每个节点的next指针 与之前的单链表一样

void add(int a, int b) //添加一条边a->b
{
e[idx]=b; //新用到的节点值为b
ne[idx]=h[a];//这个节点的next指针指向a所在点的链表原本的头结点
h[a]=idx; //更新头节点
idx++;
}

int main()
{
memset(h,-1,sizeof h); //和单链表head初始化-1一样 现在把所有链表都初始化
}

[树的重心(dfs用法)] [c++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<bits/stdc++.h>
using namespace std;

const int N=10010,M=N*2;
bool st[N]; //存有没有遍历过

int h[N],e[N],ne[N];

void add(int a, int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx;
idx++;
}

int main()
{
memset(h,-1,sizeof h);
}

void dfs(int u)
{
st[u]=true;

for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(!st[j]) dfs(j);
}
}