Dijkstra算法

Dijkstra算法是求最短路径的一种很有代表性的算法。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。

算法的基本思路:

1. 初始时令 S={V0},T={其余顶点},T中顶点对应的距离值
若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值
若不存在<V0,Vi>,d(V0,Vi)为∞
2. 从T中选取一个其距离值为最小的顶点W且不在S中,加入S
3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值
重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止

之前做了一道算法题用到过dijkstra算法,具体题意忘了,这里贴一下源代码作为dijkstra算法的示例代码:

#include<iostream>
#include<cstring>
using namespace std;
const int MIN=1000000;
int flag[5];
int a[5][5];
int dis[5];
int main()
{
	memset(flag,0,sizeof(flag));
	memset(a,MIN,sizeof(a));   //初始化矩阵
	int dian,bian;
	int u,v1,w1;
	cin>>dian>>bian;         //输入点和边的数量
	for(int i=0;i<bian;i++)
	{
		cin>>u>>v1>>w1;
		a[u][v1]=w1;         //填充邻接矩阵
	}
	for(int i=0;i<dian;i++)
	{
		dis[i]=a[0][i];     //dis[i]表示从起点到顶点i的距离
	}
	flag[0]=1;              //标记顶点是否已加入集合
	dis[0]=0;
	int v=0,w;
	for(int i=0;i<dian;i++)
	{
		int min=MIN;
		for(w=0;w<dian;w++)
			if(!flag[w]&&dis[w]<min)    //找到不在集合中并且离起点距离最短的顶点
			{
				v=w;                    //记录顶点
				min=dis[w];
			}
		flag[v]=1;
		for(w=0;w<dian;w++)             //更新选中的顶点到未选中顶点集合中所有顶点的距离
			if(!flag[w])
				if(min+a[v][w]<dis[w])   //通过中间顶点来更新
					dis[w]=min+a[v][w];
	}
	for(int i=0;i<5;i++)
		cout<<dis[i]<<endl;
	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值