最短路(Dijkstra + 優先佇列優化)
阿新 • • 發佈:2018-12-11
#include <iostream> #include <cstdio> #include <queue> #include <vector> using namespace std; const int Ni = 200010; const int INF = 2147483647; struct node{ int x,d; node(){} node(int a,int b){x=a;d=b;} bool operator < (const node & a) const { if(d==a.d) return x<a.x; else return d > a.d; } }; vector<node> eg[Ni]; int dis[Ni],n; int vis[Ni]; void Dijkstra(int s) { int i; for(i=1;i<=n;i++) { dis[i]=INF; vis[i] = 0; } dis[s]=0; vis[s] = 0; //用優先佇列優化 priority_queue<node> q; q.push(node(s,dis[s])); while(!q.empty()) { node x=q.top(); q.pop(); if(vis[x.x]) continue; vis[x.x] = 1; for(i=0;i<eg[x.x].size();i++) { node y=eg[x.x][i]; if(dis[y.x]>x.d+y.d) { dis[y.x]=x.d+y.d; q.push(node(y.x,dis[y.x])); } } } } int main() { int a,b,d,m,s; scanf("%d%d%d",&n,&m,&s); for(int i=0;i<=n;i++) eg[i].clear(); while(m--) { scanf("%d%d%d",&a,&b,&d); eg[a].push_back(node(b,d)); } Dijkstra(s); for(int i = 1; i <= n; i++) printf("%d ",dis[i]); return 0; }