弗洛伊德算法计算所有顶点对之间最短通路的长度

//弗洛伊德算法计算所有顶点对之间最短通路的长度
// procedure Floyd(G:带权简单图)
//  {G有顶点v1.v2....vn和权}
// for i= 1 to n
///  for j= 1 to n
//     d(vi,vj)=w(i,j)
//
// for i= 1 to n
///  for j= 1 to n
//     for k= 1 to n
//       if d(vj,vi)+d(vi,vk)<d(vj,vk)
//        then d(vj,vk) = d(vj,vi)+d(vi,vk)
// d(vi,vj)是在vi到vj之间的最短通路

//这个算法是计算所有顶点对之间最短通路的长度
//具体实现,应该要用到保存所有顶点对之间最短通路的长度的存贮单位(这里使用了二维数组存贮)


/*
粘贴输入下列测试数据
  6 9
0 1 4
0 2 2
1 2 1
1 3 5
2 3 8
2 4 10
3 4 2
3 5 6
4 5 3
'''''''''''''''''''''''''''''''''''''''''''''''''
0 4 2 32767 32767 32767
4 0 1 5 32767 32767
2 1 0 8 10 32767
32767 5 8 0 2 6
32767 32767 10 2 0 3
32767 32767 32767 6 3 0

0 ,0:0
0 ,1:3
0 ,2:2
0 ,3:8
0 ,4:10
0 ,5:13
1 ,1:0
1 ,2:1
1 ,3:5
1 ,4:7
1 ,5:10
2 ,2:0
2 ,3:6
2 ,4:8
2 ,5:11
3 ,3:0
3 ,4:2
3 ,5:5
4 ,4:0
4 ,5:3
5 ,5:0
Press any key to continue

*/

#include <iostream>
using namespace std;
//012345分别表示v0 v1......
  int v;//点数目
  int edge;///边数目

int** draw(int ** &l);//绘图
void shuchu(int **l);//输出
int main(int argc, char const *argv[])
{
 
  int **l;
  int**a=draw(l);
//------------------------------------------------------------------------//

//------------------------------------------------------------------------//
  int i,j,k;
  		for ( i = 0; i < v; ++i)
  			for ( j = 0; j < v; ++j)
  				for (k = 0; k < v; ++k)
  		           	if (l[j][i] + l[i][k] < l[j][k])
 						l[j][k] = l[j][i] + l[i][k];
 
  //------------------------------------------------------------------------//
  shuchu(l);
  return 0;
}
int** draw(int ** &l)//绘图
{
  int i,j;
  cin>>v>>edge;///输入点数目和边数目
  int **a=new int*[v];
  for ( i = 0; i < v; ++i)
    a[i]=new int[v];

  l=new int*[v];
   for ( i = 0; i < v; ++i)
     l[i]=new int[v];

  for ( i = 0; i < v; ++i)
    for ( j = 0; j < v; ++j)
      {
		if(i==j){a[i][j]=0;l[i][j]=0;continue;}
		a[i][j]=32767;l[i][j]=32767;
	}

  int spot1,spot2,len;
  for ( i = 0; i < edge; ++i)
  {
    cin>>spot1>>spot2>>len;
    a[spot1][spot2]=len;    a[spot2][spot1]=len;
     l[spot1][spot2]=len;    l[spot2][spot1]=len;
  }
///-------------------------------------------------------------///
    for ( i = 0; i < v; ++i){
    for ( j = 0; j < v; ++j)
      cout<<a[i][j]<<" ";
    cout<<"\n";
    }
    cout<<"\n";
  return a;
}

void shuchu(int **l)
{
	int i,j;
   for ( i = 0; i < v; ++i)
      for ( j = i; j < v; ++j)
        cout<<i<<" ,"<<j<<":"<<l[i][j]<<"\n";


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫云的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值