//Floyd算法和Dijkstra算法是求最短路径的算法,Dijkstra选定了Source,Floyd是求
//邻接矩阵G中Vi和Vj间的最短路径,1<=i,j<=Vertex
//用另一个矩阵P来包含最短通路经的信息,初始化为0
//如要寻找从V5到V1的路径。根据P,假如P(5,1)=3则说明从V5到V1经过V3,
//路径为{V5,V3,V1},如果P(5,3)=0,说明V5与V3直接相连,
//如果D(3,1)=0,说明V3与V1直接相连


#include <cstdlib>
#include <iostream>
#include<fstream>

#define Maxm 501

using namespace std;

ifstream fin("APSP.in");
ofstream fout("APSP.out");

int Vertex,Line[Maxm];
int Path[Maxm][Maxm],Map[Maxm][Maxm],Dist[Maxm][Maxm];
int k;

void Root(int p,int q)
{
   if(Path[p][q]>0)
   {
      Root(p,Path[p][q]);
      Root(Path[p][q],q);
   }
   else
   {
       Line[k]=q;
       k++;
   }
}

int main(int argc, char *argv[])
{
    int p,q,m;

    memset(Path,0,sizeof(Path));
    memset(Map,0,sizeof(Map));
    memset(Dist,0,sizeof(Dist));

    fin>>Vertex;
    for(p=1;p<=Vertex;p++)
    {
       for(q=1;q<=Vertex;q++)
       {
          fin>>Map[p][q];
          Dist[p][q]=Map[p][q];
       }
    }

    for(k=1;k<=Vertex;k++)
    {
        for(p=1;p<=Vertex;p++)
        {
           if(Dist[p][k]>0)
           {
               for(q=1;q<=Vertex;q++)
               {
                  if(Dist[k][q]>0)
                  {
                     if(((Dist[p][q]>Dist[p][k]+Dist[k][q])||(Dist[p][q]==0))&&(p!=q))
                     {
                        Dist[p][q]=Dist[p][k]+Dist[k][q];
                        Path[p][q]=k;
                     }
                  }
               }
           }
        }
    }

    for(p=1;p<=Vertex;p++)
    {
       for(q=p+1;q<=Vertex;q++)
       {
          fout << "\n==========================\n";
          fout<<"Source:"<<p<<"\n"<<"Target"<<q<<"\n";
          if(Dist[p][q]==0)
          {
              fout<<"Distance:"<<"Infinity"<<"\n";
              fout<<"Path:No way!"<<"\n";

          }
          else
          {
              fout<<"Distance:"<<Dist[p][q]<<"\n";
              fout<<"Path:"<<p;
              k=2;
              Root(p,q);
              for(m=2;m<=k-1;m++)
                 fout<<"-->"<<Line[m];
              fout<<"\n";
          }
          fout << "==========================\n";
       }
    }

    fin.close();
    fout.close();

    //system("PAUSE");
    return EXIT_SUCCESS;
}

posted on 2011-07-12 22:39  liveshow021  阅读(169)  评论(0编辑  收藏  举报