任意结点间距离

#include<iostream>

#include<string>

using namespace std;

#define maxnum 100

#define maxlength 10000

typedef int ElemType;

typedef int WType;

typedef struct{

         ElemType tu[maxnum][maxnum];    //邻接矩阵

         string point[maxnum];          //顶点矩阵

         int point_num;                 //顶点个数

}Graph;

 

 

void input(Graph &G)

{

         cout<<"请输入图的顶点数:";

         cin>>G.point_num;

         cout<<"请输入顶点的信息:"<<endl;

         for(int j=0;j<G.point_num;j++)

                   cin>>G.point[j];

         cout<<"请输入图的邻接矩阵:"<<endl;

         for(int i=0;i<G.point_num;i++)

         {

                   for(int j=0;j<G.point_num;j++)

                            cin>>G.tu[i][j];

         }

}

 

void Floyd(Graph &G,WType a[][maxnum],int path[][maxnum])

//a[i][j]是顶点i和j之间的最短路径长度,path[i][j]是相应路径上顶点j的前一顶点的顶点号

{

         int i,j,k;

         for(i=0;i<G.point_num;i++)        //矩阵a与path的初始化

                   for(j=0;j<G.point_num;j++)

                   {

                            a[i][j]=G.tu[i][j];

                            if((i!=j)&&(a[i][j]<maxlength))

                                     path[i][j]=i;

                            else

                                     path[i][j]=i;

                   }

                   for(k=0;k<G.point_num;k++)//针对每一个k,产生a(K),path(k)

                            for(i=0;i<G.point_num;i++)

                                     for(j=0;j<G.point_num;j++)

                                               if((a[i][k]+a[k][j])<a[i][j])

                                               {

                                                        a[i][j]=a[i][k]+a[k][j];

                                                        path[i][j]=path[k][j];//缩短路径长度,绕过k到j

                                               }

}

 

 

 

void printShortPath(Graph&G,WType dist[][maxnum],int path[][maxnum])

//a[i][j]是顶点i和j之间的最短路径长度,path[i][j]是相应路径上顶点j的前一顶点的顶点号

{

         //system("pause");

         cout<<"各对顶点的最短路径为:"<<endl;

         int i,j,k,l;

         int d[maxnum];

 

         for(i=0;i<G.point_num;i++)

         {

            

        

                   for(l=0;l<G.point_num;l++)

                   {

                            if(l!=i)

                            {

                                     j=l; k=0;

                                     if(dist[i][l]==maxlength)

                                     {

                                               cout<<"源点"<<G.point[i]<<"到"<<G.point[l]<<"之间无路径"<<endl;

                                     }

                                     else

                                     {

                                               while(j!=i)            //起点没有在d【k】数组里

                                               {

                                                        d[k++]=j;           //第一次j是中点

                                                        j=path[i][j];

                                               }

                                               cout<<"顶点"<<G.point[i]<<"到顶点"<<G.point[l]<<"的最短路径为:"<<G.point[i]<<" ";

                                               while(k>0)

                                               {

                                                        cout<<G.point[d[--k]]<<" ";

 

                                               }

                                               cout<<"\t\t最短路径的长度为:"<<dist[i][l]<<endl;

                                     }

                            }

                   }

         }

}

int main()

{

         Graph G;

         WType dist[maxnum][maxnum];

         int path[maxnum][maxnum];

         input(G);

         Floyd(G,dist,path);

         printShortPath(G,dist,path);

//      system("pause");

         return 0;

}

 

 

/*

4

V0 V1 V2 V3

0     1     10000 4

10000 0     9     2

3     5     0     8

10000 10000 6     0

 

  0

*/

/*

6

V0 V1 V2 V3 V4 V5

10000 10000 10    10000 30    100

10000 10000 5     10000 10000 10000

10000 10000 10000 50    10000 10000

10000 10000 10000 10000 10000 10

10000 10000 10000 20    10000 60

10000 10000 10000 10000 10000 10000

 

  0

 

*/

posted @ 2012-11-22 22:58  ♂咱說 ろ算  阅读(275)  评论(0编辑  收藏  举报