【模板】單源最短路徑(Dijkstra)/洛谷P4779
阿新 • • 發佈:2020-11-28
#include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5+5; int n, m, s, dis[N]; priority_queue <pair<int, int>, vector <pair<int, int> >, greater<pair<int, int> > > q; vector <pair<int, int> > e[N]; inline int read() { int X=0; bool flag=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();} while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();} if(flag) return X; return ~(X-1); } void Dijkstra() { dis[s] = 0; q.push(make_pair(0, s)); while (!q.empty()){ int a = q.top().second, c = q.top().first; q.pop(); if (c != dis[a]) continue; for (int i=0; i<e[a].size(); i++){ int b = e[a][i].second; if (dis[b] > dis[a]+e[a][i].first){ dis[b] = dis[a]+e[a][i].first; q.push(make_pair(dis[b], b)); } } } } int main() { int a, b, c; n=read(), m=read(), s=read(); for (int i=0; i<m; ++i) { a=read(), b=read(), c=read(); e[a].push_back(make_pair(c, b)); } for (int i=1; i<=n; ++i) dis[i] = INF; Dijkstra(); for (int i=1; i<=n; ++i) printf("%d ", dis[i]); putchar('\n'); return 0; }