在最短路问题中,如果我们面对的是稠密图(十分稠密的那种,比如说全连接图),计算多源最短路的时候,Floyd算法才能充分发挥它的优势,彻彻底底打败SPFA和Dijkstra

在别的最短路问题中都不推荐使用这个算法

我们以一道单源最短路题目介绍一下在输入数据为边表的情况下的Floyd使用情况,如果直接给了邻接矩阵的话,直接无脑求就可以了

在这里,我们把Floyd算法的功能补全,实现了一个打印最短路径的函数并加入了求无向图的最小环的功能(经过至少两个定点,权值和最小)

看定义:

int n,m,s,mina=INF;
int d[maxn][maxn],mp[maxn][maxn],p[maxn][maxn];

n个点m条边和源点s,最小环初始化为INF

然后d是最短路的答案数组,mp是初始地图数组,p是记录两个点之间的衔接点k,用来打印路径

然后是初始化:

void init()
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
d[i][j]=mp[i][j]=INF;
for(int i=;i<=n;i++) d[i][i]=mp[i][i]=;
}

这里注意,如果给的是边表,必须要这么做,如果给的是矩阵,可以直接忽略这个函数了

然后是Floyd算法:

void floyd()
{
for(int k=;k<=n;k++)
{
for(int i=;i<k;i++)
for(int j=i+;j<k;j++)
mina=min(d[i][j]+mp[j][k]+mp[k][i],mina); for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(d[i][k]<INF&&d[k][j]<INF)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]),p[i][j]=k;
}
}

如果单纯忽略mina的求解过程,这就是一个裸的,Floyd

我们再看一下路径是怎么打印的,其实很显然:

void output(int i,int j)
{
if(i==j) return;
if(p[i][j]==) printf("%d ",j);
else{output(i,p[i][j]);output(p[i][j],j);}
}

递归的思路还是很明显的

我们给出完整的实现:

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const int maxm=;
const int INF=0x7fffffff;
int n,m,s,mina=INF;
int d[maxn][maxn],mp[maxn][maxn],p[maxn][maxn];
void init()
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
d[i][j]=mp[i][j]=INF;
for(int i=;i<=n;i++) d[i][i]=mp[i][i]=;
}
void floyd()
{
for(int k=;k<=n;k++)
{
for(int i=;i<k;i++)
for(int j=i+;j<k;j++)
mina=min(d[i][j]+mp[j][k]+mp[k][i],mina); for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(d[i][k]<INF&&d[k][j]<INF)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]),p[i][j]=k;
}
}
void output(int i,int j)
{
if(i==j) return;
if(p[i][j]==) printf("%d ",j);
else{output(i,p[i][j]);output(p[i][j],j);}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
int x,y,z;
init();
for(int i=;i<=m;i++) {scanf("%d%d%d",&x,&y,&z);mp[x][y]=d[x][y]=min(z,d[x][y]);}
floyd();
for(int i=;i<=n;i++) printf("%d ",d[s][i]);
return ;
}

请注意,请注意,请注意

在不保证没有重边的情况下,一定要有

mp[x][y]=d[x][y]=min(z,d[x][y]);

否则凉凉

图论:Floyd-多源最短路、无向图最小环的更多相关文章

  1. Floyd多源最短路

    可以对每一个顶点使用Dijkstra算法求多源最短路. 这里我们来介绍另一种解法:Floyd Floyd算法的主要思想是迭代.每次迭代会朝着答案更近一步. 首先定义一个二维数组Dk[i][j](k初始 ...

  2. 【floyd 多源最短路】 poj 1125

    #include <stdio.h> #include <iostream> #include <memory.h> using namespace std; ][ ...

  3. HDU - 1869 六度分离 Floyd多源最短路

    六度分离 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即 ...

  4. 模板C++ 03图论算法 2最短路之全源最短路(Floyd)

    3.2最短路之全源最短路(Floyd) 这个算法用于求所有点对的最短距离.比调用n次SPFA的优点在于代码简单,时间复杂度为O(n^3).[无法计算含有负环的图] 依次扫描每一点(k),并以该点作为中 ...

  5. 最短路算法模板合集(Dijkstar,Dijkstar(优先队列优化), 多源最短路Floyd)

    再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个 ...

  6. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  7. 模板C++ 03图论算法 1最短路之单源最短路(SPFA)

    3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...

  8. Floyd —Warshall(最短路及其他用法详解)

    一.多元最短路求法 多元都求出来了,单源的肯定也能求. 思想是动态规划的思想:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设Dis(A ...

  9. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

随机推荐

  1. CDH组件目录\主机资源分配\端口

    目录: /var/log/cloudera-scm-installer : 安装日志目录. /var/log/* : 相关日志文件(相关服务的及CM的). /usr/share/cmf/ : 程序安装 ...

  2. 在linux下PHP和Mysql环境搞事情

    研发部门同事开发了一个接口管理辅助工具Shepherd,要求搭建在内网环境中,遇到点小问题记一下. 将开发的文件上传只web目录下,更改数据库ip,可以正常打开 登陆用户信息,此时需要连接数据库来验证 ...

  3. BluetoothServerSocket详解

    一. BluetoorhServerSocket简介 1. 继承关系 public final class BluetoothServerSocket extends Object implement ...

  4. BluetoothAdapter解析

    这篇文章将会详细解析BluetoothAdapter的详细api, 包括隐藏方法, 每个常量含义. 一 BluetoothAdapter简介 1.继承关系 该类仅继承了Object类; 2.该类作用 ...

  5. POJ 2229 计数DP

    dp[i]代表是数字i的最多组合数如果i是一个奇数,i的任意一个组合都包含1,所以dp[i] = dp[i-1] 如果i是一个偶数,分两种情况讨论,一种是序列中包含1,因此dp[i]=dp[i-1]一 ...

  6. ACM 第九天

    动态规划1 动态规划问题是面试题中的热门话题,如果要求一个问题的最优解(通常是最大值或者最小值),而且该问题能够分解成若干个子问题,并且小问题之间也存在重叠的子问题,则考虑采用动态规划. 1.LLS ...

  7. NSDate常用的日期操作

    // 当前时间创建NSDate NSDate *myDate = [NSDate date]; NSLog(@"myDate = %@",myDate); //从现在开始的24小时 ...

  8. tweenjs缓动算法使用小实例

    这里的tweenjs不是依托于createjs的tewwnjs,而是一系列缓动算法集合.因为本身是算法,可以用在各个业务场景中,这也正是总结学习它的价值所在.tweenjs代码详情: /* * Twe ...

  9. string字符串比较和替换

    我用的是小写的string!! #include <string> #include <iostream> using namespace std; int main() { ...

  10. 不能将多个项传入“Microsoft.Build.Framework.ITaskItem”类型的参数

    项目编译报错: ”对于“GenerateApplicationManifest”任务的“InputManifest”参数是无效值.不能将多个项传入“Microsoft.Build.Framework. ...