dijkstra算法:链式前向星+堆优化

最近发现struct板子真的好用。

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define scan(i) scanf("%d",&i)
 4 #define scand(i) scanf("%lf",&i)
 5 #define scanl(i) scanf("%lld",&i)
 6 #define f(i,a,b) for(int i=a;i<=b;i++)
 7 #define pb(i) push_back(i)
 8 #define ppb pop_back()
 9 #define pf printf
10 #define input freopen("in.txt","r",stdin)
11 #define output freopen("out.txt","w",stdout)
12 #define io ios::sync_with_stdio(0)
13 #define dbg(args...) cout<<#args<<" : "<<args<<endl
14 #define inf 0x3f3f3f3f
15 #define pii pair<int, int>
16 const int mod = 1e9+7;
17 const int maxn = 2e5+7;
18 using namespace std;
19 struct node {int to,w,next;} edge[maxn];
20 int n,m;
21 struct Dijkstra{
22     int dis[maxn], vis[maxn];
23     int head[maxn],cnt;
24     int s,t;
25
26     void init(){
27         memset(head,-1,sizeof(head));
28         memset(dis,0x3f,sizeof(dis));
29         memset(vis,0,sizeof(vis));
30         cnt = 0;
31     }
32
33     void add(int u,int v,int w){
34         edge[cnt].to = v;
35         edge[cnt].w = w;
36         edge[cnt].next = head[u];
37         head[u] = cnt++;
38     }
39
40     void dijkstra(){
41         priority_queue<pii,vector<pii>,greater<pii> > q;//从小到大
42         dis[s] = 0; q.push({dis[s],s});
43         while(!q.empty()){
44             int now = q.top().second;
45             q.pop();
46             if(vis[now]) continue;
47             vis[now] = 1;
48             for(int i = head[now]; i != -1; i = edge[i].next){
49                 int v = edge[i].to;
50                 if(dis[v] > dis[now] + edge[i].w){
51                     dis[v] = dis[now] + edge[i].w;
52                     q.push({dis[v],v});
53                 }
54             }
55         }
56     }
57 }dj;
58
59 int main(){
60     while(~scanf("%d%d",&n,&m) && n+m){
61         dj.init();
62         for(int i = 0; i < m; i++){
63             int u, v, w;
64             scanf("%d%d%d",&u, &v, &w);
65             dj.add(u, v, w);
66             dj.add(v, u, w);
67         }
68         dj.s=1,dj.t=n;//s起点,t终点
69         dj.dijkstra();
70         printf("%d\n",dj.dis[dj.t]);
71     }
72 }

原文地址:https://www.cnblogs.com/St-Lovaer/p/12692885.html

时间: 2024-10-09 21:56:56

dijkstra算法:链式前向星+堆优化的相关文章

【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)

Dijkstra+ 链式前向星+ 优先队列   Dijkstra算法 Dijkstra最短路算法,个人理解其本质就是一种广度优先搜索.先将所有点的最短距离Dis[ ]都刷新成∞(涂成黑色),然后从起点x (Dis[x]= 0, Dis[]值最小 )开始查询:先将x 加入(涂成灰色),对x 的所有边进行遍历,对所有搜索到的点x+ 1 进行松弛(刷新),若经过x 点的松弛,得到的距离小于原来的值:Dis[x]+ dis(x, x+ 1) < Dis[x+ 1], 则用新值刷新,把x+ 1加入(涂成灰

最短路 spfa 算法 &amp;&amp; 链式前向星存图

推荐博客  https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/details/54379641 spfa  自行百度 说的很详细 spfa 有很多实现的方法  dfs  队列  栈  都可以 时间复杂度也不稳定 不过一般情况下要比bellman快得多 #include <stdio.h> #include <math.h> #include <st

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的. 设road[i][j]表示相邻的i到j的路长U集合存储已经求得的到源点最短路径的节点,S集合表示还没求得的节点dis[i]表示i到源节点(设为0)的最短路径vis[i]=1表示i节点在U集合中 刚开始dis[0]=0,vis[0]=1;dis[i]=maxn,vis[i]=0;for 1 to

链式--前向星算法(转载学习)*重点*【模板】

转载地址:http://blog.csdn.net/acdreamers/article/details/16902023 我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了. 用len[i]来记录所有以i为起点的边在数组中的存储长度. 用head[i]记录以i为边集在数组中的第一个存储位置. 那么对于下图: 我们输入边的

前向星和链式前向星

前向星和链式前向星 1.前向星 前向星是以存储边的方式来存储图,先将边读入并存储在连续的数组中,然后按照边的起点进行排序,这样数组中起点相等的边就能够在数组中进行连续访问了.它的优点是实现简单,容易理解,缺点是需要在所有边都读入完毕的情况下对所有边进行一次排序,带来了时间开销,实用性也较差,只适合离线算法.图一-2-4展示了图一-2-1的前向星表示法. 2.链式前向星(就是数组模拟链表) 链式前向星和邻接表类似,也是链式结构和线性结构的结合,每个结点i都有一个链表,链表的所有数据是从i出发的所有

图的存储:链式前向星(边集数组)

申明:本文中提及的所有存图结构都用静态数组实现,而非链表. 0.什么是链式前向星 链式前向星是一种存图的结构,例如前向星.邻接矩阵.边表.邻接表等也是存图的结构. 1.链式前向星有何优点 链式前向星:空间利用率高,在各类竞赛中常被使用. 邻接矩阵:需要开N*N的空间,在各类竞赛中常被卡. 邻接表:空间复杂度略小于邻接矩阵,但会被极端数据卡爆,且无法记录权值. 边表:无法迅速判断两点连通性,以至不适用于大多数图的算法. 前向星:具有排序操作,时间复杂度高. 2.同类结构介绍 邻接矩阵:开二维数组,

poj-1459-最大流dinic+链式前向星

title: poj-1459-最大流dinic+链式前向星 date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM-网络流-最大流 概述 这道是一道网络流里最大流的板子题,,, 暑期集训网络流草草水过,,连基本的算法都不知道有哪些,,,更别提怎么实现了,,,只知道网络流的大致的概念,, 今天花了一天的时间重新学习了一波,,,本以为这东西很简单,,,没想到不仅算法的实现一大堆的东西,,就连题目都有时候看不懂,,,,感受就是网络流的题不仅算法实

链式前向星

重要的事情说三遍 明天不学会链式前向星我绝食三天