图有两种存储形式,这里只写其中的邻接表。
邻接表就是每个点都有一条链表。
图的遍历
可以通过bfs遍历也可以通过dfs遍历,这里用dfs遍历
比如说下面这个图,1代表n节点,n代表终节点:
如果是dfs走是这样的:
如果是bfs就可以找到最短路:
因为是个环,因此我们要保证每个节点只遍历过一次,就要开个used数组打标记。
因为我们只遍历,不是求排列组合,因此不需要回溯。
模板
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = N * 2;
int h[N]; //头节点
int e[M]; //边值
int ne[M]; //next指针
int idx; //地址
bool st[N];
//在a这个节点插入b这个边
void add(int a,int b)
{
e[idx] = b; //把b赋值给当前边值
ne[idx] = h[a]; //指向下一个节点
h[a] = idx++; //头指针移动
}
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); //如果当前节点没有被遍历就遍历
}
}
int main()
{
memset(h,-1,sizeof h); //头节点初始化
dfs(1);
return 0;
}
然后我们套上面的模板来写个模板题:树的重心 题型:图论模板题 - 掘金 (juejin.cn)