最短距离及最短路(Floyd 算法)
#include <iostream>
#include <iomanip>
using namespace std;
#define N 100
#define MAX 1000000
int d[N][N];
int path[N][N];
void Min_d(int h) //该函数找出最短距离,及最短路径
{
int i,j,k;
for(i=0;i<h;i++)
for(j=0;j<h;j++)
path[i][j]=j;
for(k=0;k<h;k++)
for(i=0;i<h;i++)
for(j=0;j<h;j++)
{
if(d[i][j]>d[i][k]+d[k][j])
{
d[i][j]=d[i][k]+d[k][j];
path[i][j]=path[i][k];
}
// cout<<setiosflags(ios::left)<<setw(4)<<d[i][j];
}
}
void show(int a,int b) //输出最短距离及最短路径
{
int j;
cout<<"d["<<a<<"]["<<b<<"]="<<d[a][b]<<endl;
cout<<"path("<<a<<"->"<<b<<"): "<<a<<"->";
j=path[a][b];
while(j!=b)
{
cout<<j<<"->";
j=path[j][b];
}
cout<<b<<endl;
}
int main()
{
memset(d,-1,sizeof(d)); //用memset()函数给整型数组赋值 其赋值方式是按位填充,并不是通常的赋值语句
int h,a,b,k;
cout<<"输入结点数:";
cin>>h;
int i,j;
cout<<"输入能直达的结点以及之间的距离(以输入 节点数,节点数,0 结束):"<<endl;
cin>>a>>b>>k;
while(a<h&&b<h)
{
d[a][b]=k;
cin>>a>>b>>k;
}
for(i=0;i<h;i++)
for(j=0;j<h;j++)
{
d[i][i]=0;
if(d[i][j]==-1)
d[i][j]=MAX;
}
Min_d(h);
int A,B;
cout<<"输入要求最短距离及最短路径的结点(已结束控制符结束):"<<endl;
while(cin>>A>>B)
{
if(A>=0&&A<h&&B>=0&&B<h)
show(A,B);
else
cout<<"输入数据有误,请从输"<<endl;
}
return 0;
}
/* int i,j,k; (Floyd算法)
int map[101][101];
for(k=1;k<=100;k++)
for(i=1;i<=100;i++)
for(j=1;j<=100;j++)
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];*/
结果:
输入结点数:4
输入能直达的结点一级之间的距离(以输入 节点数,节点数,0 结束):
0 1 1
0 3 4
1 2 9
1 3 2
2 0 3
2 1 5
2 3 8
3 2 6
4 4 0
输入要求最短距离及最短路径的结点(已结束控制符结束):
1 2
d[1][2]=8
path(1->2): 1->3->2
1 3
d[1][3]=2
path(1->3): 1->3
1 1
d[1][1]=0
path(1->1): 1->1
2 3
d[2][3]=6
path(2->3): 2->0->1->3
2 2
d[2][2]=0
path(2->2): 2->2
^Z
Press any key to continue