floyd算法(最短路径)

最短路径
描述:
已知一个城市的交通路线,经常要求从某一点出发到各地方的最短路径。例如有如下交通图:
 
则从A出发到各点的最短路径分别为:
B:0
C:10
D:50
E:30
F:60
输入:
输入只有一个用例,第一行包括若干个字符,分别表示各顶点的名称,接下来是一个非负的整数方阵,方阵维数等于顶点数,其中0表示没有路,正整数表示两点之间边的长度。可以假定该图为有向图。
最后一行为要求的出发点。
输出:
输出从已知起点到各顶点的最短路径长度。输出格式是根据顶点输入顺序,依次输出其最智短路径长度。各顶点分别用一行输出,先输出目标顶点,然后一冒号加一个空格,最后是路径长度。0表示没有路。
样例输入:
ABCDEF
0 0 10 0 30 100
0 0 5 0 0 0
0 0 0 50 0 0
0 0 0 0 0 10
0 0 0 20 0 60
0 0 0 0 0 0
A
样例输出:
B: 0
C: 10
D: 50
E: 30

F: 60

AC code:

#include <iostream>
#include <string>
using namespace std;
#define inf 100000
#define MAX 1000
int a[MAX][MAX];
int n;
void floyd()
{
	int k,i,j;
	for(k=1;k<=n;k++)
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				if(a[i][k]+a[k][j]<a[i][j])
					a[i][j]=a[i][k]+a[k][j];
			
			}

}
int main()
{
	int i,j,e;
	char s[MAX],c;
	while(gets(s))
	{
	      n=strlen(s);
		  for(i=1;i<=n;i++)
			  for(j=1;j<=n;j++)
			  {
				cin>>e;
				if(e!=0)
					a[i][j]=e;
				else
					a[i][j]=inf;
			}
		           floyd();
			cin>>c;
			for(i=0;i<n;i++)
				if(s[i]==c)
					break;
				int t=i+1;
				
				for(i=1;i<=n;i++)
				{
					if(i!=t)
					{  
						 cout<<s[i-1]<<": ";
                        if(a[t][i]!=inf)
						 cout<<a[t][i]<<endl; 
						else
						cout<<"0"<<endl;
					}
				}
	}
	return 0;
}


你可能感兴趣的:(floyd算法(最短路径))