算法笔记 最短路径

最短路径

在这里插入图片描述

Dijkstra算法(迪杰斯特拉算法)

Dijkstra算法的伪代码:
在这里插入图片描述在这里插入图片描述

用领接矩阵实现Dijkstra算法 P371

C++中return 0;与return;的区别
[fill()函数的使用(a,a+10)C语言左闭右开)

const MAXV = 1000;		//最大顶点数
const INF = 1000000000;	//设INF为一个很大的数
int n,G[MAXV][MAXV];	// n为顶点数,MAXV为最大顶点数
int d[MAXV]; 			//起点到大各点的最短路径长度
bool vis[MAXV]={false};	//标记数组 vis[i]==true表示已访问。初值均为false

void Dijkstra(int s){	//s为起点 
	fill(d,d+MAXV,INF);		//fill函数将整个d数组赋为INF(慎用memset)
	d[s] = 0;				 // 起点s到自身的距离为0
	for(int i=0;i<n;i++)
	{
		int u=-1,MIN=INF; //u使d[u]最小,MIN存放该最小的d[u]
		for(int j=0;j<n;j++)	//找到未访问的顶点中d[]最小的 
		{
			if(vis[j] == false && d[j] < MIN)
			{
				 u=j;
				 MIN=d[j];
			 } 
		 } 
		 //找不到小于INF的d[u],说明剩下的顶点和起点s不连通
		 if(u == -1)
		 return;
		 vis[u] = true; 	//标记u为已访问
		 for(int v=0;v<n;v++) 	//如果v未访问&&u能到达v&&以u为中介点可以是d[v]更优 
		 {
		 	if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v]<d[v])
		 	{
		 		d[v]=d[u]+G[u][v];		//优化d[v]	
			}

		  } 
	 } 
} 

亚历山大的例子:
在这里插入图片描述
在这里插入图片描述

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXV = 1000;		//最大顶点数
const int INF = 1000000000;	//设INF为一个很大的数(10^9) 或使用16进制0x3fffffff 表示不可达

int n,m,s,G[MAXV][MAXV];	// n为顶点数,m是边数,s是起点,MAXV为最大顶点数 
int d[MAXV]; 			//起点到各点的最短路径长度
bool vis[MAXV]={false};	//标记数组 vis[i]==true表示已访问。初值均为false

void Dijkstra(int s){	//s为起点 
	fill(d,d+MAXV,INF);		//fill函数将整个d数组赋为INF(慎用memset)
	d[s] = 0;				 // 起点s到自身的距离为0
	for(int i=0;i<n;i++)
	{
		int u=-1,MIN=INF; //u使d[u]最小,MIN存放该最小的d[u]  u是与起点s的最短距离最小的一个顶点 
		for(int j=0;j<n;j++)	//找到未访问的顶点中d[]最小的 
		{
			if(vis[j] == false && d[j] < MIN)
			{
				 u=j;
				 MIN=d[j];
			 } 
		 } 
		 //找不到小于INF的d[u],说明剩下的顶点和起点s不连通
		 if(u == -1)
		 return;
		 vis[u] = true; 	//标记u为已访问
		 for(int v=0;v<n;v++) 	//如果v未访问&&u能到达v&&以u为中介点可以是d[v]更优   d[v]是s到顶点v的最短距离 
		 {
		 	if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v]<d[v])
		 	{
		 		d[v]=d[u]+G[u][v];		//优化d[v]	
			}

		  } 
	 } 
} 

int main()
{
	int u,v,w;
	scanf("%d%d%d",&n,&m,&s);	//顶点个数、边数、起点编号 
	fill(G[0],G[0]+MAXV*MAXV,INF);   //初始化图G
	for(int i=0;i<m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);		//输入u,v以及u->v的边权
		G[u][v] = w; 
	 } 
	 Dijkstra(s); //Dijkstra算法入口
	 for(int i=0;i<n;i++)
	 {
	 	printf("%d",d[i]);		//输出所有顶点的最短距离 
	  } 
	  return 0; 
 } 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值