标签:i++ jks log dijkstra back with point int main
#include <bits/stdc++.h> #include <ext/pb_ds/priority_queue.hpp> #define toup(i,a,b) for(int i=(a);i<=(b);i++) #define toux(i,a,b) for(int i=(a);i<(b);i++) #define m_p(a,b) make_pair(a,b) #define MAXN 10005 #define inf 2147483647 #define d first #define no second using namespace std; using namespace __gnu_pbds; typedef pair<int,int> pii; typedef __gnu_pbds::priority_queue<pii,greater<pii> >Heap; struct Dijkstra{ struct Edge{ int to,w; }; int n,S,dis[MAXN]; vector<Edge> mp[MAXN]; Heap heap; Heap::point_iterator iter[MAXN]; void addEdge(int a,int b,int c){ mp[a].push_back((Edge){b,c}); return; } void GetAns(){ toup(i,1,n) if(i!=S){ iter[i]=heap.push(m_p(inf,i)); dis[i]=inf; } else{ iter[i]=heap.push(m_p(0,i)); dis[i]=0; } toux(i,1,n){ pii a=heap.top(); heap.pop(); toux(i,0,mp[a.no].size()){ Edge b=mp[a.no][i]; if(b.w+a.d<dis[b.to]){ dis[b.to]=b.w+a.d; heap.modify(iter[b.to],m_p(dis[b.to],b.to)); } } } } }; int main(){ Dijkstra d; int m; ios::sync_with_stdio(false); cin>>d.n>>m>>d.S; while(m--){ int a,b,c; cin>>a>>b>>c; d.addEdge(a,b,c); } d.GetAns(); toup(i,1,d.n) cout<<d.dis[i]<<‘ ‘; return 0; }
标签:i++ jks log dijkstra back with point int main
原文地址:http://www.cnblogs.com/HC-LittleJian/p/7782318.html