只有五行的算法——Floyd-Warshall

基本思想:最开始只允许经过1号顶点进行中转,接下来只允许经过1和2号顶点进行中转......允许经过1~n号所有顶点进行中转,求任意两点之间的最短路径. 用一句话概括就是:从 i 号顶点到 j 号顶点只经过前 k 号点的最短路径. 时间复杂度O(N^3).

Code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define INF 999999

int main(int argc, char const *argv[])
{
	int k, i, j, n, m;
	int q1, q2, q3;
	int e[10][10];

	scanf("%d %d", &n, &m);

	for(i = 1; i <= n; ++i)
	{
		for(j = 1; j <= n; ++j)
		{
			if(i == j)
			{
				e[i][j] = 0;
			}
			else
			{
				e[i][j] = INF;
			}
		}
	}

	for(i = 1; i <= m; ++i)
	{
		scanf("%d %d %d", &q1, &q2, &q3);
		e[q1][q2] = q3;
	}

	for(k = 1; k <= n; ++k)             /// Floyd-Warshall 算法核心语句
	{
		for(i = 1; i <= n; ++i)
		{
			for(j = 1; j <= n; ++j)
			{
				if(e[i][j] > e[i][k] + e[k][j])
				{
					e[i][j] = e[i][k] + e[k][j];
				}
			}
		}
	}

	for(i = 1; i <= n; ++i)
	{
		for(j = 1; j <= n; ++j)
		{
			printf("%5d", e[i][j]);
		}
		printf("\n");
	}

	system("pause");
	return 0;
}

Floyd-Warshall 算法不能解决带有“负权回路”或者叫“负权环”的图,因为带有“负权回路”的图没有最短路径.

这个就不存在 1 号顶点到 3 号顶点的最短路径,因为1->2->3->1->2->3->1->...1->2->3 这样的路径,每绕一次 1->2->3 这样的环,最短路径就会减少1,永远找不到最短路径.

时间: 2024-10-01 02:26:35

只有五行的算法——Floyd-Warshall的相关文章

只有五行的算法》》Foloyd-Warshall算法(多元最短路径问题)

#include<stdio.h> int main() { int INF=9999999;//音节划分:无穷的 infinite int map[100][100]; int N,M; scanf("%d%d",&N,&M); int i,j; int k; for(i=1;i<=N;i++) for(j=1;j<=N;j++){ if(i==j) map[i][j]=0; else map[i][j]=INF; } int m; for(k

最短路算法 :Bellman-ford算法 &amp; Dijkstra算法 &amp; floyd算法 &amp; SPFA算法 详解

 本人QQ :2319411771   邮箱 : [email protected] 若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 很早就想写一下最短路的总结了,但是一直懒,就没有写,这几天又在看最短路,岁没什么长进,但还是加深了点理解. 于是就想写一个大点的总结,要写一个全的. 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并

几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较(转)

几大最短路径算法比较 几个最短路径算法的比较:Floyd        求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3).       Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题. Floyd-Warshall算法的时间复杂度为O(N^3),空间复杂度为O(N^2). Floyd-Warshall的原理是动态规划:设Di,j

只有五行的算法--floyd-warshall

floyd-warshall算法用来求最短路径(即动态规划)求任意两点的最短距离 时间复杂度为O(N3),空间复杂度为O(N2). 到达目的地有两种方法,一:直接点对点,没有中转站.二:经过中转站直接到达. 在求最短路径前,先谈谈地图的存储 如图,使用二元数组存储.图中无穷大代表没有道路,e[1][2]=2代表1城市到2城市的路径 核心代码 for (int k = 0; k <= 3; k++) for (int i = 0; i < 4; i++) for (int j = 0; j &l

多源最短路算法——floyd算法

1 #include<bits/stdc++.h> 2 #define ll long long 3 #define scan(i) scanf("%d",&i) 4 #define scand(i) scanf("%lf",&i) 5 #define scanl(i) scanf("%lld",&i) 6 #define f(i,a,b) for(int i=a;i<=b;i++) 7 #define

多源最短路径算法—Floyd算法

前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra算法来求最短路径,并且算法的思想很简单--贪心算法:每次确定最短路径的一个点然后维护(更新)这个点周围点的距离加入预选队列,等待下一次的抛出确定.但是虽然思想很简单,实现起来是非常复杂的,我们需要邻接矩阵(表)储存长度,需要优先队列(或者每次都比较)维护一个预选点的集合.还要用一个boolean数组

图的最短路径算法-- Floyd算法

Floyd算法求的是图的任意两点之间的最短距离 下面是Floyd算法的代码实现模板: const int INF = 10000000; const int maxv = 200; // maxv为最大顶点数 int n, m; // n 为顶点数,m为边数 int dis[maxv][maxv]; // d[i][j]表示顶点i顶点j的最短距离 void Floyd(){ for (int k = 0; k < n; k++){ for (int i = 0; i < n; i++){ fo

最短路径(一)—Floyd-Warshall(只有五行的算法)

"多源最短路径"--计算任意两个城市之间的最短路径. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.公路是单向的.我们现在需要求任意两个城市之间的最短路径,也就是求任意两个点之间的最短路径.这个问题称为"多源最短路径"问题. 用4*4的矩阵存储图的信息,二维数组e存储. 之前通过dfs和bfs可以求出两点之间的最短路径.所以进行n^2遍深度或者广度优先搜索,即对每两个点都进行一次深度或者广度优先搜索,便可求的任意两点之间的最短路径. Floyd-Wars

图的最短路算法 Floyd

多源最短路径算法 时间复杂度O(N3) 简单修改可求有向图的传递闭包 #include<iostream> using namespace std; const int maxn=1024; const int inf=1<<30; int d[maxn][maxn]; int n,m; void init() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=(i==j?0:inf); } int main()