软件测试作业 图中任意两点的最短路径

软件测试相关:

#include<iostream>

using namespace std;

#define INFTY 65535 //边不相邻用INFTY代替

//存储图的邻接矩阵

int m[4][4]={{0,1,INFTY,4},{INFTY,0,9,2},{3,5,0,8},{INFTY,INFTY,6,0}};

class MGraph

{

      public:

             MGraph(int size);

             ~MGraph();

             void Floyd();

             void shortestway(int u,int v);

      private:

              int **a,**d,**path;

              int n;

};

MGraph::MGraph(int size)

{

   n=size;

   a=new int*[n];

   for(int i=0;i<n;++i)

     a[i]=new int[n];

    

   for( i=0;i<n;++i)

     for(int j=0;j<n;++j)

          a[i][j]=m[i][j];//用邻接矩阵初始化

}

MGraph::~MGraph()

{

   for(int i=0;i<n;++i)

      delete []a[i];

   delete []a;

   a=NULL;

  

   for( i=0;i<n;++i)

     delete []d[i];

   delete []d;

   d=NULL;

  

   for( i=0;i<n;++i)

      delete []path[i];

   delete []path;

   path=NULL;

}

void MGraph::Floyd()

{

     int i,j,k;

     d=new int*[n];

     path=new int*[n];

     for( i=0;i<n;++i)

     {

        d[i]=new int[n];

        path[i]=new int[n];

        for(j=0;j<n;++j)

        {

           d[i][j]=a[i][j];

           if(i!=j && m[i][j]<INFTY) path[i][j]=i;//i表示弧的起点

           else path[i][j]=-1;//其实感觉这个-1没啥用,只是不让它和i点的值冲突即可

        }

     }

     for(k=0;k<n;++k)


       for(i=0;i<n;++i)

         for(j=0;j<n;++j)

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

           {

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

             path[i][j]=path[k][j];//k这是一个新加入的点,将k加入path中去

           }

}

void MGraph::shortestway(int u,int v)//输出最短路径

{
int way[4];
int q=0;

int w=v;

while (w!=u)

{

      way[q++] = path[u][w];

      w=path[u][w];

}

cout<<u<<" 到 "<<v<<" 的最短路径为:";

--q;

for (int j=q; j>=0; j--)

      cout<<way[j]<<" ->";

cout<<v<<endl;

}

 void shortestPath(MGraph g, int node1, int node2){

            g.Floyd();
		    g.shortestway(node1,node2);

 }

int main()

{

    MGraph *g=new MGraph(4);

    //g.Floyd();

    //g.shortestway(0,2);
   shortestPath(*g,0,2);

    system("pause");

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值