图论,最短路,堆优化迪杰斯特拉

学习了迪杰斯特拉.

类似贪心.

也有点像弗洛伊德.

上代码.

这种是规定了起始节点为1的.

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string>
 4 #include <bits/stdc++.h>
 5
 6 using namespace std;
 7 #define MAXN 10001
 8 #define MAXM 100001
 9
10 //n点m边
11
12 struct edge{
13     int v;
14     int w;
15     int nxt;
16 }e[MAXM];
17 int head[MAXN];
18 int cnt;
19
20 void addedge(int x,int y,int z) {
21     e[++cnt].v=y;
22     e[cnt].w=z;//边权
23     e[cnt].nxt=head[x];
24     head[x]=cnt;
25 }
26 int dist[MAXN];
27 bool vis[MAXN];
28 priority_queue< pair<int,int> > q;
29 //第一维是dist相反数,这是大根堆
30 //第二维是节点编号
31 int n,m;
32
33
34 void dijkstra () {
35     memset(dist,0x3f,sizeof(dist));
36     memset(vis,0,sizeof(vis));
37     dist[1]=0;
38     q.push(make_pair(0,1));
39     while (q.size()) {
40         int x=q.top().second;
41         q.pop();
42         if (vis[x]) continue;
43         vis[x]=1;
44         for (int i=head[x];i;i=e[i].nxt) {
45             int y=e[i].v;
46             int z=e[i].w;
47             if (dist[y]>dist[x]+z) {
48                 dist[y]=dist[x]+z;
49                 q.push(make_pair(-dist[y],y));
50             }
51         }
52     }
53 }
54
55 int main () {
56     cin>>n>>m;
57     for (int i=1;i<=m;i++) {
58         int x,y,z;
59         cin>>x>>y>>z;
60         addedge(x,y,z);
61         //addedge(y,x,z);
62     }
63     dijkstra();
64     for (int i=1;i<=n;i++) {
65         cout<<dist[i]<<" ";
66     }
67     return 0;
68 }
69
70 /*
71 5 8
72 1 2 2
73 1 3 1
74 1 5 4
75 2 3 6
76 2 4 3
77 2 5 4
78 4 5 5
79 3 5 2
80 */

其实迪杰斯特拉还可以是有起点的,

自己可以定起点,

下面就是,

这就是单元最短路,

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string>
 4 #include <bits/stdc++.h>
 5
 6 using namespace std;
 7 #define MAXN 10001
 8 #define MAXM 100001
 9
10 //n点m边
11
12 struct edge {
13     int v;
14     int w;
15     int nxt;
16 } e[MAXM];
17 int head[MAXN];
18 int cnt;
19
20 void addedge(int x,int y,int z) {
21     e[++cnt].v=y;
22     e[cnt].w=z;//边权
23     e[cnt].nxt=head[x];
24     head[x]=cnt;
25 }
26 int dist[MAXN];
27 bool vis[MAXN];
28 priority_queue< pair<int,int> > q;
29 //第一维是dist相反数,这是大根堆
30 //第二维是节点编号
31 int n,m;
32
33
34 void dijkstra (int st) {
35     memset(dist,0x3f,sizeof(dist));
36     memset(vis,0,sizeof(vis));
37     dist[st]=0;
38     q.push(make_pair(0,st));
39     while (q.size()) {
40         int x=q.top().second;
41         q.pop();
42         if (vis[x]) continue;
43         vis[x]=1;
44         for (int i=head[x]; i; i=e[i].nxt) {
45             int y=e[i].v;
46             int z=e[i].w;
47             if (dist[y]>dist[x]+z) {
48                 dist[y]=dist[x]+z;
49                 q.push(make_pair(-dist[y],y));
50             }
51         }
52     }
53 }
54
55 int main () {
56     cin>>n>>m;
57     for (int i=1; i<=m; i++) {
58         int x,y,z;
59         cin>>x>>y>>z;
60         addedge(x,y,z);
61         //addedge(y,x,z);
62     }
63     for (int i=1; i<=n; i++) {
64         dijkstra(i);
65         cout<<"以"<<i<<"为起点"<<endl;
66         for (int i=1; i<=n; i++) {
67             cout<<dist[i]<<" ";
68         }
69         cout<<endl;
70         cout<<endl;
71     }
72
73
74     return 0;
75 }
76
77 /*
78 5 8
79 1 2 2
80 1 3 1
81 1 5 4
82 2 3 6
83 2 4 3
84 2 5 4
85 4 5 5
86 3 5 2
87 */

原文地址:https://www.cnblogs.com/codemaker-li/p/9775681.html

时间: 2024-08-15 11:18:43

图论,最短路,堆优化迪杰斯特拉的相关文章

最短路之Dijkstra(迪杰斯特拉)

一般用法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.重点----->>>>注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径

优化迪杰斯特拉

1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 #define Heap pair<int, int> 5 //第一个int存的是到起点的距离,第二个int存的是点的编号 6 7 using namespace std; 8 9 const int INF = 2147483647; 10 int n, m, t, cnt; 11 int next[1000001], to[1000

bfs输出路径 &amp;&amp; 最短路(迪杰斯特拉)输出路径

问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<queue> 6 #include<vector> 7 using

最短路径之迪杰斯特拉与双向迪杰斯特拉实验结果

1.  实验数据 数据集:City of Oldenburg (OL) Road Network 9组查询均为相距较远的结点 2. 实验结果一 最近一直在围绕双向迪杰斯特拉转,对其中重要的优先队列数据结构,尝试了用无索引的二叉堆实现.有索引的二叉堆实现以及无索引的斐波那契实现三种方式.其中无索引的优先队列允许出现相同的节点,而有索引的优先队列中不允许.不同实现方式运行时间如表2-1所示,其中每个查询都运行了10000次,单位ms. 表2-1 双向迪杰斯特拉不同优先队列实现方式运行结果 查询 双向

dijkstra(迪杰斯特拉)最短路算法的堆优化

dijkstra(迪杰斯特拉)最短路算法是一种时间复杂度经过严格证明的最短路算法. 优化在于每次取最小值的时候采用堆优化,但是在最短路松弛过程中,dist是不断修改的,所以,为了能使复杂度降到O(nlogn),dist修改的同时,在堆中也要修改. 注意dijkstra(迪杰斯特拉)最短路算法只能用于正权边. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algo

迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 让我来翻译一下:Dijkstra可以求出一个点到一个图中其他所有节点的最短路径,故也称对于单源最短路径的一种解法 算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即

最短路 迪杰斯特拉.cpp

<span style="color:#3333ff;">#include<stdio.h> #include<stdlib.h> #define INITITY 999//最大值 #define VERTEX 20//最多顶点个数 #define FALSE 0 #define TURE 1 #define size 30 #define OVERFLOW -1 typedef struct ArcCell{ int adj;//权值类型 }Arc

HDU 2544最短路 (迪杰斯特拉算法)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 83843    Accepted Submission(s): 36272 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-sh

迪杰斯特拉算法_优化版

迪杰斯特拉优化版本:vector + 优先队列 △迪杰斯特拉算法的核心:每次找距离s点最短的元素 + 松弛操作 ①要用优先队列取出最短距离降低时间复杂度,用veotor减少空间 ②定义一个pair类型,作为优先队列的元素.typedef pair<int , int > P ,first是距离,second是边的终点 ③pair类型作为优先队列的元素时,默认排序是先排序first,后再排序second.(升序) 因此,距离是first,边的终点是second,不可调换 #include <