弗洛伊德变种算法计算最短路径

这个算法和Dijkstra算法的区别在于;Dijkstra算法适用于大图,它能够指定到达某个点即停止计算;而这个算法则一般不能用于大图(时间过长),因为它必然是n的2次方次运算。

两个算法都是计算某一个点到其他各点的最短通路
弗洛伊德算法则是计算所有顶点对之间最短通路的长度

//弗洛伊德变种算法计算最短通路(更改,使其计算v0点到各点的最短通路)
// procedure Floyd(G:带权简单图)
//  {G有顶点v1.v2....vn和权}
// for i= 1 to n
//     for k= 1 to n
//       if d(v0,vi)+d(vi,vk)<d(v0,vk)
//        then d(v0,vk) = d(v0,vi)+d(vi,vk)
// d(v0,vj)是在vi到vj之间的最短通路


//使用了huilu数组存放这个点的前一个合理点;
//while( no_s(v-1,s) )//当所求的点不在s中,这语句严格来说是求点(v-1)这个点到始点的路径
//for(i=0;i<v;++i)//这条语句能求所有点的最短路径

/*
粘贴输入下列
4 4
0 1 1
0 3 8
0 2 3
2 3 4
、、、、、、、、、、、、、、、、、、、、、、

  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
32767 4 2 32767 32767 32767
4 32767 1 5 32767 32767
2 1 32767 8 10 32767
32767 5 8 32767 2 6
32767 32767 10 2 32767 3
32767 32767 32767 6 3 32767

0
021
02
0213
02134
021345
Press any key to continue
*/

#include <iostream>
using namespace std;
//012345分别表示v0 v1......
  int v;//点数目
  int edge;///边数目
  int si=0;//si用来控制s数组的位置

int** draw();//绘图
void digui_shuchu(int k,int *huilu);//递归输出
int main(int argc, char const *argv[])
{
  int i;
  int**a=draw();
//------------------------------------------------------------------------//
  int* l=new int[v];//存放i点到0点的路径长度
  for ( i = 0; i < v; ++i)l[i]=32767;
//------------------------------------------------------------------------//
  int* huilu=new int[v];//存放i点的前一个合理点
  for ( i = 0; i < v; ++i)huilu[i]=-1;
//------------------------------------------------------------------------//
l[0]=0;
 int u;
  huilu[0]=0;
//------------------------------------------------------------------------//
  	for ( u = 0; u < v; ++u)
  	{
  		for ( i = 0; i < v; ++i)
  		{
         if (l[u]+a[u][i] < l[i])//lenth和路径将会改变
         {/更换i的所有数据            
           l[i]=l[u]+a[u][i];
           huilu[i]=u;
         }
  		}
  	}
  
  //------------------------------------------------------------------------//
	for(int f=0;f<v;++f)
	{
		  cout<<"0";
		digui_shuchu(f,huilu);
	   cout<<"\n";
    }
  return 0;
}
int** draw()//绘图
{
  int i,j;
  cin>>v>>edge;///输入点数目和边数目
  int **a=new int*[v];
  for ( i = 0; i < v; ++i)
    a[i]=new int[v];
  for ( i = 0; i < v; ++i)
    for ( j = 0; j < v; ++j)
      a[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;
  }
///-------------------------------------------------------------///
    for ( i = 0; i < v; ++i){
    for ( j = 0; j < v; ++j)
      cout<<a[i][j]<<" ";
    cout<<"\n";
    }
    cout<<"\n";
  return a;
}

void digui_shuchu(int k,int *huilu)
{
  if (k!=0)
  {
  digui_shuchu(huilu[k],huilu);
  cout<<k;
  }
  else return;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

紫云的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值