1. 程式人生 > 實用技巧 >洛谷P4779 題解 單源最短路標準版

洛谷P4779 題解 單源最短路標準版

Solution

這是一道Dijkstra最短路的模板題

在這裡就不說明dj的原理和正確性了(自己查),注意dj僅限於邊權為非負的圖

還有這題竟然卡SPFA(毒),還是用開了堆優化的dijkstra吧

複雜度是O((n+m))log⁡n)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int maxm=5e5+10;
bool vis[maxn];
int head[maxn],dis[maxn];
int cnt=0,m,n,s,t;
struct edge{
    int next,to,dis;
}e[maxm];
inline 
void add_edge(int u,int v,int w) { cnt++; e[cnt].dis=w; e[cnt].to=v; e[cnt].next=head[u]; head[u]=cnt; } struct node { int u; int id; bool operator<(const node &x)const { return x.u<u; } }; priority_queue<node> q; inline void dijkstra() { dis[s]
=0; q.push((node){0,s}); while(!q.empty()) { int x=q.top().id; q.pop(); if(vis[x]) continue; vis[x]=1; for(int i=head[x];i;i=e[i].next) { int y=e[i].to; if(dis[y]>dis[x]+e[i].dis) { dis[y]
=dis[x]+e[i].dis; q.push((node){dis[y],y}); } } } } int main() { scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=n;i++) { dis[i]=0x7fffffff; } for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add_edge(u,v,w);//注:若是無向圖請加上add_edge(v,u,w); } dijkstra(); for(int i=1;i<=n;i++) { printf("%d ",dis[i]); } return 0; }