只有五行的演算法--Floyd-Warsha

Haskei發表於2016-11-04

告訴你各個城市之間的距離,讓你求從某個城市到另一個城市的最短路徑問題

因為從一個城市到另一個城市想要縮短距離,只能經過其他城市來縮短距離

</pre><pre code_snippet_id="1967318" snippet_file_name="blog_20161104_1_472332" name="code" class="cpp">#include<iostream>  
#include<cstdio>  
#include<cstdlib>  
#include<cstring>  
#include<string>  
#include<queue>  
#include<algorithm>  
#include<map>  
#include<iomanip>  
#define INF 99999999  
using namespace std;  
  
int city[6][6];

int main()
{
	//建立城市之前的關係圖,自身到自身距離為0,兩個城市無法到達則為INF 
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
		{
			if(i==j)
				city[i][j]=0;
			else city[i][j]=INF;
		}
	int x,y,r;
	//輸入題目給出的兩個城市之間的距離 
	for(int i=1;i<=8;i++)
	{
		scanf("%d%d%d",&x,&y,&r);
		city[x][y]=r;
	}
		
	
	for(int i=1;i<=4;i++) //經過幾號頂點 來縮短路徑 
	{	//從j號頂點到k號頂點的距離能否通過i號頂點作為中介縮短路程,如果可以,則更新兩點之前的最短路程 
		for(int j=1;j<=4;j++)
		{
			for(int k=1;k<=4;k++)
			{
				if(city[j][k]>city[j][i]+city[i][k])//如果通過i點的中轉,路徑可以縮小,則更新兩個城市之間的距離
					city[j][k]=city[j][i]+city[i][k];
			}
		}
	}
	//列印出縮短後的路徑,city[i][j]代表i點到j點的最短距離 
	for(int i=1;i<=4;i++)
	{
		for(int j=1;j<=4;j++)
		{
			printf("%d ",city[i][j]);
		}
		printf("\n");
	}		
	return 0;
} 
/*測試資料 
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12

程式執行效果
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0 
*/



相關文章