优化迪杰斯特拉

 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[1000001], val[1000001], head[10001], dis[10001];
12 bool vis[1000001];
13 priority_queue <Heap, vector <Heap>, greater <Heap> > q;
14 //按照第一个int从小到大排序
15
16 inline void add(int a, int b, int c){
17     to[cnt] = b;
18     val[cnt] = c;
19     next[cnt] = head[a];
20     head[a] = cnt++;
21 }
22
23 inline void Dijkstra(int s){//以s为起点
24     int i, u, v;
25     Heap x;
26     for(i = 1; i <= n; i++) dis[i] = INF;
27     dis[s] = 0;
28     q.push(make_pair(0, s));//入队
29     while(!q.empty()){
30         x = q.top();
31         q.pop();
32         u = x.second;
33         if(vis[u]) continue;//判断是否已经是最短路径上的点
34         vis[u] = 1;
35         for(i = head[u]; i != -1; i = next[i]){//更新距离
36             v = to[i];
37             if(dis[v] > dis[u] + val[i]){
38                 dis[v] = dis[u] + val[i];
39                 q.push(make_pair(dis[v], v));
40             }
41         }
42     }
43 }
44
45 int main(){
46     int i, j, a, b, c, s;
47     scanf("%d %d %d", &n, &m, &s);
48     memset(head, -1, sizeof(head));
49     for(i = 1; i <= m; i++){
50         scanf("%d %d %d", &a, &b, &c);
51         add(a, b, c);
52     }
53     Dijkstra(s);
54     for(i = 1; i <= n; i++) printf("%d ", dis[i]);
55     return 0;
56 }

优化以后的

优化的迪杰斯特拉,推荐一下

但在某些情况下慢

时间: 2024-10-10 04:28:56

优化迪杰斯特拉的相关文章

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

学习了迪杰斯特拉. 类似贪心. 也有点像弗洛伊德. 上代码. 这种是规定了起始节点为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 edg

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以外的其他顶点,即

迪杰斯特拉算法_优化版

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

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法 本篇名言:"辛勤的蜜蜂永没有时间悲哀.--布莱克" 这次来看下Dijkstra )算法.还是老方法,先原理,后实现.代码来自网络. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47046031 1.  最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 管道铺设.线路安排

中兴捧月算法精英挑战赛-迪杰斯特拉派

赛题为: 最强大脑中的收官蜂巢迷宫变态级挑战,相信大家都叹为观止!最强大脑收官战打响后,收视率节节攀升,就连蚁后也不时出题难为一下她的子民们.在动物世界中,称得上活地图的,除了蜜蜂,蚂蚁当仁不让.在复杂多变的蚁巢中, 蚂蚁总是能以最快.最高效的方式游历在各个储藏间(存储食物).今天,她看完最新一期节目,又发布了一项新任务:小蚁同学,我需要玉米库的玉米,再要配点水果,去帮我找来吧.小蚁正准备出发,蚁后又说:哎呀,回来,我还没说完呢,还有若干要求如下: 1.小蚁同学,你需要尽可能以最少的花费拿到食物

Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/attachments Description Andrew is having a hard time preparing his 239-th contest for Petrozavodsk. This time the solution to the problem is based on Di

用迪杰斯特拉算法实现地铁的站点搜索

上一篇文章,利用迪杰斯特拉(dijkstra)算法,实现了无向图的最短路径搜索功能.本篇将以南京地铁为例,用迪杰斯特拉算法实现两个站点之间的最短路径搜索. 借用百度百科,南京2015年4月份的地铁运行线路图如下: 创建一个数据构造类,初始化南京地铁的各条线路站点数据(截至2015年4月南京地铁运营公司数据,与上图对应) /** * */ package com.test.dijkstra; import java.util.ArrayList; import java.util.HashSet;

迪杰斯特拉--记录路径

迪杰斯特拉记录路径的办法就是开一个数组, 记录一下该节点的上一个节点是谁最后在递归输出就可以了 例题: B. wzy的大冒险——出发咯QAQ 单点时限: 2.0 sec 内存限制: 512 MB wzy踏上了冒险的旅程.现在他从地精手里买了一份地图,地图上有n个城镇.他从第一个城镇出发,走向(没钱只能走)第n个城镇,现在,请你帮wzy找到一条最短的路径,并倒序(从n到1)输出一条最短路径.举个栗子:如果有两条路径6 4 3 1和6 5 2 1,我们选择6 4 3 1这条.地精小提示:路是单向的Q