最短距离及最短路(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

 

posted @ 2012-07-26 20:42  紫素  阅读(214)  评论(0编辑  收藏  举报