Dijkstra算法(最短路)

Dijkstra算法是单源最短路径算法;利用的是贪心思想,每次选择当前的最靠近源点的顶点确定为最短路径(所以Dijkstra算法需要满足的是所有边的权值都为正值,所以Dijkstra不能处理负边权问题)。

算法思路:

1. 将所有点分为两部分:已知最短路径顶点和未知最短路径顶点,先将源点加入已知最短路径,利用book[]存储。

2. 初始化各顶点的最短路径,有源点直接相连的点设置为边的权值,没有直接相连的点设置为无穷大;

3. 在所有未知最短路径的顶点中寻找距离最小的将其确定为最短路径,并对这点的所有出边进行松弛操作;

4. 重复3操作,直到所有点确定最短路径;

代码:

#include <string.h>
#include<iostream>
#include<vector>
#include<queue>
#define _Max 200020
#define INF 1<<30
using namespace std;
int main()
{
    int e[10][10],dis[_Max],book[_Max];
    int n,m,s,t,w;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) e[i][j]=0;
            else e[i][j]=INF;
        }
    }
    cin>>n>>m;
    for(int i=0;i<m;i++){
        cin>>s>>t>>w;
        e[s][t]=w;
    }
    //初始化1号顶点到其他顶点的距离
    for(int i=1;i<=n;i++){
        dis[i]=e[1][i];
    }
    //初始化book数组,1表示已求得最短路径,0表示未知最短路径
    for(int i=1;i<=n;i++){
        book[i]=0;
    }
    book[1]=1;

    int min,u;
    //dijkstra算法核心语句
    for(int i=1;i<n;i++){//每次可以求得一个顶点的最短路径,通过n-1轮即可全部求出
        //找到距离源点最远的未知最短路径的点,则这点可以确定为最短路径
        min=INF;
        for(int j=1;j<=n;j++){
            if(book[j]!=1&&dis[j]<min){
                min=dis[j];
                u=j;
            }
        }
        book[u]=1;
        for(int k=1;k<=n;k++){
            if(e[u][k]<INF&&book[k]==0){
                if(dis[k]>dis[u]+e[u][k])
                    dis[k]=dis[u]+e[u][k];
            }
        }
    }
    for(int i=0;i<=n;i++){
        cout<<dis[i]<<endl;
    }

    return 0;
}

输入示例:

6 9
1 2 1

1 3 12

2 3 9

2 4 3

3 5 5

4 3 4

4 5 13

4 6 15

5 6 4

输出示例:

0

1

8

4

13

17

Dijstra算法为什么不能处理负边权问题?

例如:有三条边 1 3 8, 1 2 9, 2 3 -2;

由于Dijstra算法贪心思想,会先确定3号顶点的最短路径为8,但是因为有负边1-2-3的路径权值为7,所以当有负边是Dijstra算法不再适用;

原文地址:https://www.cnblogs.com/zdl2234/p/10360613.html

时间: 2024-11-29 07:15:03

Dijkstra算法(最短路)的相关文章

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

Dijkstra算法 --- 单源最短路

Dijkstra算法适用于边权值为正的情况,可用于计算正权图上的单元最短路. 其伪代码如下: 设d[v0] = 0, 其他d[i] = INF 循环n次{ 在所有未标号的结点中,选取d值最小的结点x 给结点x加上永久标号 对于从x出发的所有边,执行松弛操作. } //松弛操作的伪代码如下: RELAX(u,v,w) if(u.d + w(u,v) < v.d){ v.d = w.d + w(u,v); pre[v] = u; } Dijkstra算法代码: /* Dijkstra 单源最短路算法

最短路 Dijkstra算法

Dijksitra算法求最短路仅仅适用于不存在右边是负权的情况(Bellman-Ford算法没有这一个限制).主要特点是从起点为中心向外层层扩展,直到扩展到终点为止. 最短路的最优子结构性质 即一个最短路路径中经过的所有点这条路均是其最短路.(反证法易证) Dijkstra基本思路: ①找到最短距离已经确定的顶点,从它出发更新相邻顶点的最短距离 ②此后不需要再关心1中的"最短距离已经确定的顶点" 在最开始的时候,只有起点的最短距离是确定的.而在尚未使用过的顶点中,距离d[i]最小的顶点

HDU2544 最短路【Dijkstra算法】

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 34628    Accepted Submission(s): 15003 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

POJ-3268-最短路(dijkstra算法)

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12494   Accepted: 5568 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X

HDU 2544 最短路(我的dijkstra算法模板、SPAFA算法模板)

思路:这道题是基础的最短路径算法,可以拿来试一下自己对3种方法的理解 dijkstra主要是从第一个点开始枚举,每次枚举出当当前最小的路径,然后再以那最小的路径点为起点,求出它到其它未标记点的最短距离 bellman-ford 算法则是假设有向网中有n 个顶点.且不存在负权值回路,从顶点v1 和到顶点v2 如果存在最短路径,则此路径最多有n-1 条边.这是因为如果路径上的边数超过了n-1 条时,必然会重复经过一个顶点,形成回路:而如果这个回路的权值总和为非负时,完全可以去掉这个回路,使得v1到v

单源最短路Dijkstra算法——matlab实现

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

【裸单源最短路:Dijkstra算法两种版本】hdu 1874 畅通工程续

Source : hdu 1874 畅通工程续 http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束.

最短路和次短路问题,dijkstra算法

1 /* 2  *题目大意: 3  *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和; 4  * 5  *算法思想: 6  *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; 7  *将dist数组开成二维的,即dist[v][2],第二维分别用于记录最短路和次短路; 8  *再用一个cnt二维数组分别记录最短路和次短路的条数; 9  *每次更新路径的条数时,不能直接加1,,应该加上cnt[u][k],k为次短路径或者最短路径的标记; 10  *

POJ 1511 Invitation Cards 【最短路,spfa算法,Dijkstra算法堆优化】

Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 25219   Accepted: 8346 Description In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They wan