floyd算法

多源最短路径算法—Floyd算法

北战南征 提交于 2019-11-30 15:53:48
前言 在 图论 中,在寻路最短路径中除了 Dijkstra 算法以外,还有 Floyd 算法也是非常经典,然而两种算法还是 有区别 的,Floyd主要计算多源最短路径。 在单源正权值最短路径 ,我们会用 Dijkstra算法 来求最短路径,并且算法的思想很简单—— 贪心算法 :每次确定最短路径的一个点然后维护(更新)这个点周围点的距离加入预选队列,等待下一次的抛出确定。但是虽然思想很简单, 实现起来是非常复杂 的,我们需要邻接矩阵(表)储存长度,需要优先队列(或者每次都比较)维护一个预选点的集合。还要用一个boolean数组标记是否已经确定、还要--------- 总之, Dijkstra 算法的 思想上是很容易接受 的,但是 实现上其实是非常麻烦 的。但是单源最短路径没有更好的办法。复杂度也为 O(n2) 而在n节点多源最短路径中,如果 从Dijkstra算法的角度上 ,只需要将Dijkstra封装,然后执行n次Dijkstra算法即可,复杂度为 O(n3) 。但是这样感觉很臃肿,代码量巨大,占用很多空间内存。有没有啥方法能够稍微变变口味呢? 答案是有的,这就是易写但稍需要理解的 Floyd 算法。一个求多元最短路径算法。 算法介绍 先看看百度百科的定义吧: Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似

最短路——Floyd算法

大城市里の小女人 提交于 2019-11-28 11:01:27
Folyd算法求最短路 介绍: Folyd算法是用来求带权图中每两点之间的最短路的动态规划算法,(它每次求得的值都可以在后面使用)。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。 算法思想: 要从节点i走到j总的来说只有两种办法,一种是直接从i到j,不途径任何节点;另一种是经过若干个中间节点k到达j。有时候走“直路”的距离不一定会比走“弯路”的距离要短,所以,我们要做的就是要检查在i,j之间插入其他节点能否让他们之间的路径变短。 算法描述: 对结点数为n的图,初始化S为表示图中每两点距离的矩阵,令k=1; 依次检查S中的每两个结点u,v之间的距离dis(u,v),在插入了k之后会不会变短。若变短,则更新他们之间的距离,即令dis(u,v)=dis(u,k)+dis(k,v); k+1,重复2,3步骤,直到k=n。 特点: 这个算法写起来很简单,和Dijkstra算法比起来,它能很方便的求出图中每两点之间的距离,但是由于它需要使用三个循环来遍历各种插入的情况,所以在结点数比较多的时候会比较耗时。 C++实现: #include<iostream> using namespace std; #define MAX 100 #define INF 100000 int G[MAX][MAX]; int main() { int n, m;

Floyd佛洛伊德算法

家住魔仙堡 提交于 2019-11-27 22:29:24
弗洛伊德算法求解图中任意一对顶点之间的最短路径,其路径信息用二维数组path[ ][ ]存储,另外还需维护一个二位数组A(k)[ i ] [ j ]用来存储顶点i经由顶点k作为中间顶点到达顶点j的最短路径长度,当然如果以k作为中间顶点时路径较之前边长,则数组A中的路径长度仍不变,与其对应的path数组也不会将k存入对应位置。 #include<stdio.h> //弗洛伊德算法求解图中任意一对顶点之间的最短路径,其需要维护两个二维数组 A(k)[i][j]和path[i][j] //k表示从顶点i到顶点j的路径中加入顶点作为中间顶点,path[i][j]中存储从顶点i到顶点j要经过的中间顶点 void Floyd(Mgrap G,int path[][]) { int i,j,k,A[MAXSIZE][MAXSIZE]; //初始化数组A和path for(i = 0;i < G.vexnum;++i){ for(j = 0;j < G.vexnum;++j){ A[i][j] = G.edges[i][j]; path[i][j] = -1; //一开始没有中间顶点 故给值-1 } } //关键步骤三重循环 for(k = 0;k < G.vexnum;++k){ for(i = 0;i < G.vexnum; ++i){ for(j = 0;j < G.vexnum;++j){

POJ-3660(Floyd算法)

梦想与她 提交于 2019-11-26 10:02:37
Cow Contest POJ-3660 1.本题考察的是最短路,用的算法是Floyd算法 2.如果一个结点和剩余的n-1个结点都有关系,那么可以确定其排名 3.需要注意的是,判断是否有关系时,反向关系也要考虑 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m; int map[101][101]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; int a,b; memset(map,0,sizeof(map)); for(int i=0;i<m;i++){ cin>>a>>b; map[a][b]=1; } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(!map[i][j]) if(map[i][k]&&map[k][j]){ map[i][j]=1; } } } } int cnt=0; for(int i=1;i<=n;i++){ int ans=0; for(int j=1;j<=n;j++){ if(i!=j){ if(map[i][j]|