ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

最短路径(Bellman-Ford算法)

2019-03-16 16:54:27  阅读:242  来源: 互联网

标签:10 遍历 int Bellman 最短 flag 条边 Ford check


主要思想:
遍历m条边,看是否能让从给定点直接到v点缩短为从给定点到u点再到v点。
因为任意两点之间的最短路径最多包含n-1条边,所以把这些边遍历n-1次就好。

代码:

#include <stdio.h>
int main()
{
	int i, k, n, m, u[10], v[10], w[10], dis[10], check, flag;
	int inf=99999999;
	
	scanf("%d %d", &n, &m);
	for (i=1; i<=m; i++)
		scanf("%d %d %d", &u[i], &v[i], &w[i]);
	
	for (i=1; i<=n; i++)
		dis[i]=inf;
	dis[1]=0;//表示以1为源点 
	
	for (k=1; k<=n-1; k++)//最短路径一定不包含回路,不论是正权回路还是负权回路都没有,所以n个顶点最多有n-1条边 
	{					  //所以 最多 只需要遍历n-1次 
		check=0;
		for (i=1; i<=m; i++)
		{
			if (dis[v[i]]>dis[u[i]]+w[i])
			{
				dis[v[i]]=dis[u[i]]+w[i];
				check=1;
			}
		}
		if (check==0)//如果有一次遍历中没有对任何顶点进行松弛,则表明所有点都为最短路径了 
			break;
	}
	
	flag=0;
	for (i=1; i<=m; i++)//如果遍历完n-1次后还可以进行松弛,则表明存在负权的回路 
		if (dis[v[i]]>dis[u[i]]+w[i])
			flag=1;
	if (flag==1)
		printf("存在负权回路");
	else
	{
		for (i=1; i<=n; i++)
			printf("%2d", dis[i]);
	}
	
	return 0;
}

分析:
因为遍历的是m条边,和边密切相关,所以边数越小,计算越快,适合稀疏图
可以解决负边权,当第n次还能松弛时,说明存在负权回路
适合解决单源最短路径

标签:10,遍历,int,Bellman,最短,flag,条边,Ford,check
来源: https://blog.csdn.net/weixin_42172261/article/details/88599791

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有