mxqz 最短路板子

P4779 【模板】单源最短路径(标准版)

dijk
by angiing1222 @ 2023-11-03 17:57:31


dij 吧
by Mikefeng @ 2023-11-03 17:57:47


@[Mikefeng](/user/406832) 那这 Dijkstra 好奇怪,能跑负权图? 在 AcWing 上甚至已经过了 SPFA 板子
by Crsuh2er0 @ 2023-11-03 17:59:10


堆优Dij,SPFA的原理是利用队列优化m轮的松弛操作
by Rainylower @ 2023-11-03 17:59:47


@[Crsuh2er0](/user/762775) 这个不是负权图啊。
by 红黑树 @ 2023-11-03 18:01:19


@[Crsuh2er0](/user/762775) 那应该是数据太水导致的。
by Ew_Cors @ 2023-11-03 18:01:30


@[Crsuh2er0](/user/762775) SPFA板子那道题有判断负环吗?如果没有的话说明都是非负权边,Dij当然可以过
by Rainylower @ 2023-11-03 18:01:44


@[红黑树](/user/413140) 在 AcWing 上跑的负权图
by Crsuh2er0 @ 2023-11-03 18:02:09


@[Rainylower](/user/275079) 没有负环判断,但是题目描述写了有负权边
by Crsuh2er0 @ 2023-11-03 18:04:31


在 AcWing 上的代码如下: ```cpp #include <bits/stdc++.h> using namespace std; typedef long long LL; #define MAXN 100010 int n,m,dis[MAXN]; struct edge{ int v,w; bool operator>(const edge &tmp)const{ return w > tmp.w; } }; basic_string<edge> p[MAXN]; priority_queue<edge,basic_string<edge>,greater<edge> > q; void Dijkstra(){ fill(dis,dis + n + 1,INT_MAX); q.push({1,dis[1] = 0}); while(!q.empty()){ int u = q.top().v,d = q.top().w; q.pop(); if(d != dis[u]) continue; for(const auto &[v,w] : p[u]){ if(dis[v] > LL(dis[u]) + w){ dis[v] = dis[u] + w; q.push({v,dis[v]}); } } } } int main(){ cin.tie(0) -> ios::sync_with_stdio(0); cout.tie(0); cin>>n>>m; for(int i = 1,u,v,w;i <= m;i++){ cin>>u>>v>>w; p[u].push_back({v,w}); } Dijkstra(); if(dis[n] == INT_MAX) cout<<"impossible"; else cout<<dis[n]; return 0; } ```
by Crsuh2er0 @ 2023-11-03 18:05:17


| 下一页