最短路算法(dijkstra,bellman_ford,floyd)

最短路算法

dijkstra(初级的最短路算法,适合稠密图,可用邻接表优化)

bool relax(int u,int v)
{
    double tmp=max(dist[u],edge[u][v]);
    if(tmp<dist[v]){
        dist[v]=tmp;
    }
}

void dijkstra()
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;i++){
        int x;
        double mindist=INF;
        for(int j=0;j<n;j++){
            if(vis[j]) continue;
            if(dist[j]<mindist) mindist=dist[x=j];
        }
        vis[x]=1;
        for(int v=0;v<n;v++){
            if(v==x) continue;
            relax(x,v);
        }
    }
}

dijkstra

bellman_ford(实用高效的最短路算法,实际复杂度远小于最坏复杂度o(NM),可判断负环)

bool bellman_ford() //bool 判断是否有负环
{
    for(int i=0;i<n;i++) dist[i]=(i==s)0:INF;
    for(int i=0;i<n-1;i++){ //松弛n-1次,实际小于n-1次
        bool flag=0;        //此变量判断能否继续松弛,若不能退出算法
        for(int j=0;j<e;j++){
            if(relax(j)) flag=1;
        }
        if(dist[s]<0) return true;
        if(!flag) return false;
    }
    for(int i=0;i<e;i++){    //此处检查负环,如果松弛了n-1次还能继续松弛说明有负环
        if(relax(i)) return true;
    }
    return false;
}

负环版

int bellman_ford()
{
    for(int i=0;i<n;i++) dist[i]=(i==s)0:INF;
    for(int i=0;i<n-1;i++){
        bool flag=0;
        for(int j=0;j<e;j++){
            if(relax(j)) flag=1;
        }
        if(!flag) break;
    }
    return dist[s];
}

最短路版

floyd(适合求任意两点的最短路或传递闭包判断拓扑序列,时间复杂度较高)

void floyd()
{
    for(int k=1;k<=n;k++){
        for(int u=1;u<=n;u++){
            for(int v=1;v<=n;v++){
                if(edge[u][v]<edge[u][k]+edge[k][v]) edge[u][v]=edge[u][k]+edge[k][v];
            }
        }
    }
}

/*
传递闭包:将循环内改成这样即可:
   if(G[u][k]&&G[k][v]) G[u][v]=1;
*/

floyd

除此之外求最短路还有SPFA,A*等算法,以后再慢慢学------

时间: 2024-10-12 13:06:42

最短路算法(dijkstra,bellman_ford,floyd)的相关文章

hdu 2544 最短路 (dijkstra,floyd)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找到两点间最短的距离值. 代码一:(dijkstra算法) 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int n,Min,node[105],visit[105],map[105][105]; 5 void set() 6 { 7 for (int i=1; i<=n; i

最短路(Dijkstra,Floyd,Bellman_Ford,SPFA)

当然,这篇文章是借鉴大佬的... 最短路算法大约来说就是有4种——Dijkstra,Floyd,Bellman_Ford,SPFA 接下来,就可以一一看一下... 1.Dijkstra(权值非负,适用于有向图及无向图,单源最短路) 1 Dijkstra's算法解决的是图中单个源点到其它顶点的最短路径.只能解决权值非负(看了代码就知道了)2 Dijkstral只能求出任意点到达源点的最短距离(不能求出任意两点之间的最短距离),同时适用于有向图和无向图,复杂度为O(n^2).3算法的过程: 1设置顶

hdu 1595 最短路算法dijkstra

find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2094    Accepted Submission(s): 739 Problem Description Marica is very angry with Mirko because he found a new gi

最短路算法 —— Dijkstra算法

用途: 解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题) 算法核心(广搜): (1)确定的与起点相邻的点的最短距离,再根据已确定最短距离的点更新其他与之相邻的点的最短距离. (2)之后的更新不需要再关心最短距离已确定的点 三种实现模板: 一.矩阵朴素版 二.vector简单版 三.静态邻接表有点复杂版 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #includ

图的最短路算法 Dijkstra及其优化

单源最短路径算法 时间复杂度O(N2) 优化后时间复杂度为O(MlogN)(M为图中的边数 所以对于稀疏图来说优化后更快) 不支持有负权的图 #include<iostream> using namespace std; const int maxn=1024; const int inf=1<<30; int n,m; int d[maxn]; int v[maxn]; int G[maxn][maxn]; void init() { for(int i=1;i<=n;i+

最短路算法 :Bellman-ford算法 &amp; Dijkstra算法 &amp; floyd算法 &amp; SPFA算法 详解

 本人QQ :2319411771   邮箱 : [email protected] 若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 很早就想写一下最短路的总结了,但是一直懒,就没有写,这几天又在看最短路,岁没什么长进,但还是加深了点理解. 于是就想写一个大点的总结,要写一个全的. 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并

[ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)

以杭电2544题目为例 最短路 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0

最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)

Dijkstra算法: 解决的问题: 带权重的有向图上单源最短路径问题.且权重都为非负值.如果采用的实现方法合适,Dijkstra运行时间要低于Bellman-Ford算法. 思路: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi...Vk)也必定是从i到k的最短路径.为了求出最短路径,Dijkstra就提出了以最短路径长度递增,逐次生成最短路径的算法.譬如对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj

【啊哈!算法】算法7:Dijkstra最短路算法

上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. <ignore_js_op> 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. <ignore_js_op> 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下.