码迷,mamicode.com
首页 > 其他好文 > 详细

dijkstra

时间:2017-11-04 11:18:33      阅读:123      评论:0      收藏:0      [点我收藏+]

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

  

dijkstra

标签:i++   jks   log   dijkstra   back   with   point   int   main   

原文地址:http://www.cnblogs.com/HC-LittleJian/p/7782318.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!