博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
弗洛伊德算法(Floyd)
阅读量:4969 次
发布时间:2019-06-12

本文共 3287 字,大约阅读时间需要 10 分钟。

此算法可以求任意两点的最短距离,其中边权值可以为负数,而dijkstra只能是固定的点间的距离,并且边全值不能为负数。

保存的是后面的点(更好)

#include<iostream>

#include<stdio.h>
#include<iomanip>
using namespace std;
#define N 100
#define MAX 1000000
int a[N][N];
int path[N][N];
void input (int n)
{
 int p,q,len,i,j;
 for( i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  {
   a[i][j]=MAX;
   if(i==j)
    a[i][j]=0;
  }
 while(1)
 {
  cin>>p>>q;
  if(p||q)
   cin>>len;
  else
   break;
  a[p][q]=len;
 }
}
void Floyd(int n)
{
 int i,j,k;
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   path[i][j]=j;//初始化路径,将i后面的点记录在path中
 for(k=1;k<=n;k++)
  for(i=1;i<=n;i++)
   for(j=1;j<=n;j++)
    if(a[i][j]>a[i][k]+a[k][j])
    {
     a[i][j]=a[i][k]+a[k][j];
     path[i][j]=path[i][k];/*path记录i后面的点*/
    }
 printf("最短路径矩阵如下:\n");
 for(i=1;i<=n;i++)/*打印最短路径矩阵j*/
 {
  for(j=1;j<=n;j++)
   printf("%8d",a[i][j]);
  cout<<endl;
 }
}
void Dispath(int n)//输出经过的点
{
 int i,j,h;
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  {
         cout<<" 点 "<<i<<" 到点 "<<j<<" 最短长度为: "<<a[i][j];
   cout<<" 经过的点为:  ";
            cout<<i<<"->";
         h=path[i][j];
         while(h!=j)
   {
             cout<<h<<"->";
          h=path[h][j];
   }
         cout<<j<<endl;
  }
}   
int main()
{
 int n;
 scanf("%d",&n);
 input(n);
 Floyd(n);
 Dispath(n);
 return 0;
}
或者

保存的是前面的点

#include<iostream>

#include<stdio.h>
#include<iomanip>
using namespace std;
#define N 100
#define MAX 10000
int a[N][N];
int path[N][N];
void input (int n)
{
 int p,q,len,i,j;
 for( i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  {
   a[i][j]=MAX;
   if(i==j)
    a[i][j]=0;
  }
 while(1)
 {
  cin>>p>>q;
  if(p||q)
   cin>>len;
  else
   break;
  a[p][q]=len;
 }
}
void Floyd(int n)
{
 int i,j,k;
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   path[i][j]=i;//初始化路径,将j前面的点记录在path中
 for(k=1;k<=n;k++)
  for(i=1;i<=n;i++)
   for(j=1;j<=n;j++)
    if(a[i][j]>a[i][k]+a[k][j])
    {
     a[i][j]=a[i][k]+a[k][j];
     path[i][j]=path[k][j];/*path记录j前面的点*/
    }
 printf("最短路径矩阵如下:\n");
 for(i=1;i<=n;i++)/*打印最短路径矩阵*/
 {
  for(j=1;j<=n;j++)
   printf("%8d",a[i][j]);
  cout<<endl;
 }
}
void Dispath(int n)//输出经过的点
{
 int i,j,temp,que[N],tot;
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  {
   tot=1;
   que[tot++]=j;
   temp=path[i][j];
   while(temp!=i)
   {
    que[tot++]=temp;
    temp=path[i][temp];
   }
   que[tot]=i;
   cout<<" 点 "<<i<<" 到点 "<<j<<" 最短长度为: "<<a[i][j];
   cout<<" 经过的点为:  ";
   for(;tot>1;tot--)
    cout<<que[tot]<<"->";
   cout<<que[tot]<<endl;
  }
}   
int main()
{
 int n;
 scanf("%d",&n);
 input(n);
 Floyd(n);
 Dispath(n);
 return 0;
}
递归也可以

#include<iostream>

#include<stdio.h>
#include<iomanip>
using namespace std;
#define N 100
#define MAX 10000
int a[N][N];
int path[N][N];
void input (int n)
{
 int p,q,len,i,j;
 for( i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  {
   a[i][j]=MAX;
   if(i==j)
    a[i][j]=0;
  }
 while(1)
 {
  cin>>p>>q;
  if(p||q)
   cin>>len;
  else
   break;
  a[p][q]=len;
 }
}
void Floyd(int n)
{
 int i,j,k;
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   path[i][j]=-1;
 for(k=1;k<=n;k++)
  for(i=1;i<=n;i++)
   for(j=1;j<=n;j++)
    if(a[i][j]>a[i][k]+a[k][j])
    {
     a[i][j]=a[i][k]+a[k][j];
     path[i][j]=k;
    }
 printf("最短路径矩阵如下:\n");
 for(i=1;i<=n;i++)/*打印最短路径矩阵*/
 {
  for(j=1;j<=n;j++)
   printf("%8d",a[i][j]);
  cout<<endl;
 }
}
void ppath(int i,int j)//递归你懂吗
{
 int k;
 k=path[i][j];
 if(k==-1)
  return;
 ppath(i,k);
 printf("->%d",k);
 ppath(k,j);
}
void Dispath(int n)//输出经过的点
{
 int i,j;
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  {
   cout<<" 点 "<<i<<" 到点 "<<j<<" 最短长度为: "<<a[i][j];
   cout<<" 经过的点为:  ";
   cout<<i;
   ppath(i,j);
   cout<<"->"<<j;
   cout<<endl;
  }
}   
int main()
{
 int n;
 scanf("%d",&n);
 input(n);
 Floyd(n);
 Dispath(n);
 return 0;
}

 

转载于:https://www.cnblogs.com/heqinghui/archive/2012/07/27/2611906.html

你可能感兴趣的文章
在项目中移除CocoaPods
查看>>
面试题三 替换空格
查看>>
LeetCode104.二叉树最大深度
查看>>
linux usb驱动——Gadget代码介绍
查看>>
【洛谷】CYJian的水题大赛【第二弹】解题报告
查看>>
POJ 1703 Find them, Catch them【种类/带权并查集+判断两元素是否在同一集合/不同集合/无法确定+类似食物链】...
查看>>
L1-5. A除以B【一种输出格式错了,务必看清楚输入输出】
查看>>
Git一分钟系列--快速安装git客户端
查看>>
bzoj 3160 万径人踪灭 —— FFT
查看>>
poj3254二进制放牛——状态压缩DP
查看>>
使用 ref 和 out 传递数组注意事项
查看>>
三个线程ABC,交替打印ABC
查看>>
flex4.6 图表 在module中 x轴旋转正确的做法
查看>>
LeetCode Binary Tree Preorder Traversal
查看>>
spark_to_kakfa
查看>>
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法
查看>>
combobox和textbox中输入数据为非数字leave时的公用事件,只需要在控件的leave事件中选择本事件即可...
查看>>
[原创]如何确保JavaScript的执行顺序 –之jQuery1.5.1与jQuery1.4.4的差异
查看>>
Java生鲜电商平台-源码地址公布与思考和建议
查看>>
一个数据库小题目
查看>>