图论-最短路算法

求最短路暂时掌握了4种,但感觉就dijkstra复杂度能用;

1   floyd算法:

就是暴力的三重循环,以每个点为中转点,每次遍历所有的点,看看能不能通过这个中转点更新最短路径;

优点:n<200时用这种方法,用邻接矩阵存图 ,可求任意的两点的最短路;而且好写;

缺点:复杂度太高,O(n^3)的复杂的,太多不必要的计算;

void floyd(){
    //dis数组表示i到j的最短路径
    for(int k=0;k<n;k++)//重点,必须放在外面
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);

}

2   bellman-floyd算法:

解决单源最短路,就是循环n次,每次检查每一条边,看看是否能通过邻居更新最短的路径

优点:n<1e7可以考虑这种方法,用结构体数组存图即可,然后这是并行式计算,循环怎么搞都行,

缺点:复杂度还是蛮高的,每个点  O(n*m)的复杂度;

void bellman(){
    int s,t;//s为起点,t为终点
    for(int i=1;i<=n;i++)dis[i]=inf;
    //dis数组表示所有点到s的最短路
    dis[s]=0;
    for(int k=1;k<=n;k++)
    for(int i=0;i<cnt;i++){
    int x=e[i].u,y=e[i].v;
    if(dis[x]>dis[y]+e[i].w){//更新距离
    dis[x]=dis[y]+e[i].w;
        }
    }
    cout<<dis[t];
}

3    SPFA  :

缺点:不稳点,

算法:和广搜很像;

学了再更新;

4    dijkstra:

算法:基于贪心思想,就是每次更新之后,路径最短的那个点一定是最终的最短路径,因为借道去其他点必定比这个距离大;一次次迭代;

优点:考虑用邻接表存图,复杂度可以接受,而且稳定;解决单源最短路问题,复杂度O(m*log(n));

int dijkstra(){
    int s,t;//s表示起点,t表示终点
    for(int i=0;i<=maxn;i++)dis[i]=inf,done[i]=0;
    dis[s]=0;
    //dis表示每个点到s的最短路,done数组记录是否得到最短路
    priority_queue<node>Q;
    Q.push(node(s,0));
    while(!Q.empty()){
    node u=Q.top();
    Q.pop();
    if(done[u.id])continue;
    done[u.id]=1;
    for(int i=0;i<e[u.id].size();i++){
    edge y=e[u.id][i];
    if(done[y.v])continue;
    if(dis[y.v]>y.w+u.dis){
    dis[y.v]=y.w+u.dis;//更新邻居的最短路
    }
    Q.push(node(y.v,dis[y.v]));//把每个邻居节点扩充进来
    }

    }
    return dis[t];
}

判负圈的问题,学了再补充;

原文地址:https://www.cnblogs.com/littlerita/p/12343890.html

时间: 2024-10-14 13:50:26

图论-最短路算法的相关文章

从存图到最短路算法的图论总结

INTRODUCTION: 图论算法在计算机科学中扮演着很重要的角色,它提供了对很多问题都有效的一种简单而系统的建模方式.很多问题都可以转化为图论问题,然后用图论的基本算法加以解决.--百度百科 对于OI而言,图是指由若干给定的点及若干条连接两点的线(边)所构成的图形 借助图论知识,我们往往可以将一些复杂的问题转化到基础的图论算法上,进而使用已有算法解决全新问题 那么想如果想要运用图论,首先要从存图开始 前排感谢教我图论的周润喵老师,syc学长,就序老师 可是我还是没学会 一,存图 对于一个图而

图论基础——最短路算法集锦

最短路算法有个基础——————松弛操作(在大多数最短路算法都会涉及) if(d[e[i].v]>d[e[i].u]+w[i])//如果这条边的终点到源点的距离大于起点到源点距离,就替换. { d[e[i].v]>d[e[i].u]+w[i]; } 最短路算法一共有多少种方法我不知道,在这里我只想记录4种: •Dijkstra:求单源点最短路(不含负边权) •Bellman-ford:求单源点最短路(可含负边权) •SPFA(使用队列优化后的Bellman-ford) •Floyd:求各点间的最

彻底搞懂最短路算法

转载自:戳 彻底弄懂最短路径问题 只想说:温故而知新,可以为师矣.我大二的<数据结构>是由申老师讲的,那时候不怎么明白,估计太理论化了(ps:或许是因为我睡觉了):今天把老王的2011年课件又看了一遍,给大二的孩子们又讲了一遍,随手谷歌了N多资料,算是彻底搞懂了最短路径问题.请读者尽情享用…… 我坚信:没有不好的学生,只有垃圾的教育.不过没有人理所当然的对你好,所以要学会感恩. 一.问题引入 问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径——最短路径.解决

图论 最短路 基础

图论基础 , 最短路 图的简单概念 顶点 (Vertex), 边 (Edge) 有向图 , 无向图 , 无向图是一种特殊的有向图 度,有向图分为出度 和 入度,无向图的度,代表 连出去的边 顶点和边都可以具有属性,称为权重,顶点称为 点权,边 称为 边权 稠密图 边很多,大约是 顶点的平方 稀疏图 边很少 , 重边(平行边),自环, 路径:从一给顶点到达另一个顶点称为一条路径 路径中边的数量称为路径长度,如果路径中的顶点均不重复,称为简单路径 如果路径中的第一个顶点 \(v_i\) 和最后一个顶

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

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

最短路算法汇总

校赛完了,这次校赛,做的很差,一个算法题没有,2个水题,1个贪心,概率DP,DP,数论题.DP还没开始研究,数论根本不会,数学太差了,省赛时卡数论,校赛依然卡数论,我擦,还是得继续学习啊! 一把锈迹斑斑的剑,只有不断的磨砺,才能展露锋芒! 以下为最短路总结: 最短路问题可分为: 一.单源最短路径算法,解决方案:Bellman-Ford算法,Dijkstra算法,SPFA 二.每对顶点间的最短路径算法:Floyd: (1).Dijkstra算法: (经典的算法,可以说是最短路问题的首选事例算法,但

最短路算法及其延伸

个人算法训练题集:http://acm.hust.edu.cn/vjudge/contest/toListContest.action#contestType=0&contestRunningStatus=0&contestOpenness=0&title=风斩冰华&manager= 密码xwd,欢迎大家一起来学习. 首先复习一下最短路问题,即求某两点之间边权最小的一条路径.这样就延伸出了两个子问题: 求任意两点的距离,还是求图上固定一个起点到某点的距离? 验题:http:

【啊哈!算法】算法6:只有五行的Floyd最短路算法

暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向的.我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径.这个问题这也被称为“多源最短路径”问题. 现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储.比如1号城市到2号城市的路程为2,则设e[1][2]

最短路算法大杂烩

最短路算法主要有以下几个: 一 Dijkstra 二 Bellman-Ford 三 SPFA 四 ASP 五 Floyd-Warshall 首先约定一下图的表示: struct Edge{         int from,to,wt;     };     vector<int>G[N];     vector<Edge>G[N]; -------------Dijkstra算法 使用条件:无负权边 复杂度O:((V+E)*log(V)) 下面是用优先队列实现的Dijkstra算