dfs求最短路 图论

57 阅读1分钟

图有两种存储形式,这里只写其中的邻接表。

邻接表就是每个点都有一条链表。

图的遍历

可以通过bfs遍历也可以通过dfs遍历,这里用dfs遍历

比如说下面这个图,1代表n节点,n代表终节点: image.png

如果是dfs走是这样的:

image.png

如果是bfs就可以找到最短路: image.png

因为是个环,因此我们要保证每个节点只遍历过一次,就要开个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)