[模板]单源最短路径(Dijkstra)

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

主要还是再打一遍最短路,这种算法我用的不多。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 inline int read()
 5 {    int x=0;bool f=0;char ch=getchar();
 6     while(!isdigit(ch)){    f=(ch==45);ch=getchar();}
 7     while(isdigit(ch)) {    x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
 8     return f?(~x+1):x;
 9     }
10 #define man 500010
11 int n,m,st;
12 int head[man<<2],num=0;
13 struct edge
14 {    int next,to,dis;}e[man<<2];
15 inline void add(int from,int to,int dis)
16 {    e[++num].next=head[from];
17     e[num].to=to;
18     e[num].dis=dis;
19     head[from]=num;
20     }
21 int dis[man<<2];
22 bool vis[man<<2];
23 inline void djikstra(int s)
24 {    int turn=n-1;
25     for(int i=1;i<=n;i++) dis[i]=2147483647,vis[i]=0;
26     for(int i=head[s];i;i=e[i].next)
27         dis[e[i].to]=e[i].dis;
28     dis[s]=0;
29     while(turn--)
30     {    int mx=2147483647;
31         int t=0;
32         for(int i=1;i<=n;i++)
33             if(!vis[i]&&dis[i]<mx)
34                 mx=dis[i],t=i;
35         if(t==0||mx==2147483647) break;
36         vis[t]=1;
37         for(int i=head[t];i;i=e[i].next)
38             if(dis[e[i].to]>dis[t]+e[i].dis)
39                 dis[e[i].to]=dis[t]+e[i].dis;
40         }
41     }
42 int main()
43 {    n=read(),m=read(),st=read();
44     for(int i=1;i<=m;i++)
45     {    int x=read(),y=read(),z=read();
46         add(x,y,z);
47         }
48     djikstra(st);
49     for(int i=1;i<=n;i++)
50         printf("%d ",dis[i]);
51     putchar(‘\n‘);
52     return 0;
53     }
时间: 2024-08-02 13:31:54

[模板]单源最短路径(Dijkstra)的相关文章

数据结构:单源最短路径--Dijkstra算法

Dijkstra算法 单源最短路径 给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离.指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题. Dijkstra算法 求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法.该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点. 算法思想 带权图G=<V,E>,令S为已确定了最短路径顶点的集合,则可用V-S表示剩余未确定最短路径顶点的集合.假设V0是源点,则初始 S={V

单源最短路径Dijkstra算法

1.单源最短路径 函数:返回还未被收录顶点中dist最小者 1 Vertex FindMinDist(MGraph Graph, int dist[], int collected[]) 2 { 3 /*返回未被收录顶点中dist最小者*/ 4 Vertex MinV, V; 5 int MinDist = INFINITY; 6 7 8 for (V = 0; V < Graph->Nv; ++V) 9 { 10 if (collected[V] == false && di

单源最短路径Dijkstra、BellmanFord、SPFA【模板】

Dijkstra算法: 将所有点分为两个集合.如果源点s到u的最短路径已经确定,点u就属于集合Va,否则属于集合Vb. 1.将源点s到图中各点的直接距离当做初始值记录为s到各点的最短距离,不能到达的记为INF.S到S距离为0. 2.在集合Vb中的点中找一个点u,使得源点s到该点u路径长度最短,将u从Vb中除去,加到V1中.这时候求出了当前S到u的最短路径. 3.把新确定的点u更新s到集合Vb中每一个点v的距离,如果s到u的距离加上u到v的直接距离小于当前s到v的距离,则表示新找到的最短路径长度比

单源最短路径 dijkstra算法实现

本文记录一下dijkstra算法的实现,图用邻接矩阵表示,假设图为无向图,并且连通,有向图,不连通图的做法类似. 算法简述: 首先确定"单源"的源,假设是第0个顶点. 维护三个数组dist[], color[], path[],设其下标分别为0-i-n-1: dist[] 表示源点到顶点i的最短距离,在初始化时,如果源点到顶点i有路径,则初始化为路径的权重,否则初始化为INT_MAX: color[] 数组其实表示两个集合,即color[i]值为1的集合表示已经确定最短路径的点的集合,

(转)图算法单源最短路径Dijkstra算法(邻接表/邻接矩阵+优先队列STL)

一.前言 最短路径算法,顾名思义就是求解某点到某点的最短的距离.消耗.费用等等,有各种各样的描述,在地图上看,可以说是图上一个地点到达另外一个地点的最短的距离.比方说,我们把地图上的每一个城市想象成一个点,从一个城市到另一个城市的花费是不一样的.现在我们要从上海去往北京,需要考虑的是找到一条路线,使得从上海到北京的花费最小.有人可能首先会想到,飞机直达啊,这当然是时间消耗最小的方法,但是考虑到费用的高昂,这条线路甚至还不如上海到北京的高铁可取.更有甚者,假设国家开通了从上海到西藏,再从西藏到兰州

单源最短路径——Dijkstra算法学习

每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好理解,堪称完美. 内容摘抄如下: 网络中的最短路径是一条简单路径,即是一条不与自身相交的路径,最短路径搜索的依据:若从S点到T点有一条最短路径,则该路径上的任何点到S的距离都是最短的. Dijkstra算法搜索步骤: 1.对起始点作标记S,且对所有顶点令D(X)=∞,Y=S: 2.对所有未做标记的点按以下公式

[模板]单源最短路径

https://www.luogu.org/problemnew/show/P3371 1 #include <cstring> 2 #include <cstdio> 3 #include <iostream> 4 #include <queue> 5 #define lop(i,a,b) for(register int i=a;i<=b;++i) 6 const int N = 10010, M = 500010, inf = 214748364

单源最短路径Dijkstra和优先级算法

百度百科:迪杰斯特拉算法. 代码实现如下: import java.util.Comparator; import java.util.PriorityQueue; import java.util.Scanner; class Node { int x; int value; } public class Main { static int N,M,cnt; static final int MAX = 105; static final int INF = 1000009; static N

【洛谷 p3371】模板-单源最短路径(图论)

题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<queue> 6 using namespace std; 7 typedef long long LL; 8 9 const int N=10010,M=500010; 10 c