图论专题小结:最短路算法

1.Dijkstra算法(适用于边权为正的图)

(1)概述:该算法可以计算正权图的单源最短路,即从一个单个源点出发,到所有结点的最短路。伪代码如下:

         清除所有点的标号

         设d[0]=0,其他d[i]=INF

         循环n次

        {

             在所有未标号的结点中,选出d值最小的结点x

             给结点x标记

             对于从x出发的所有边(x,y),更新d[y]=min{d[y],d[x]+w(x,y)}

        }

下面给出优化到O(M*logN)的代码

#define N 10000
#define INF 1000000
struct Edge
{
	int from,to,dist;
	Edge(int u, int v, int d) :from(u), to(v), dist(d){}
};
struct HeapNode//将d值,编号捆绑为一个结构体
{
	int d, u;
	HeapNode(int dd, int uu) :d(dd), u(uu){};
	bool operator <(const HeapNode&rhs)const
	{
		return d>rhs.d;
	}
};
struct Dijkstra
{
	int n, m;
	vector<Edge>edges;
	vector<int>G[N];
	bool done[N];//是否已经永久标记
	int d[N]; //s到各个点的距离
	int p[N]; //最短路中的上一条边

	void init()//初始化
	{
		this->n 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值