标签: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