Dijkstra


*洛谷P4779 单源最短路径

#include
using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10, inf = 0x3f3f3f3f;
int n, m, s, dis[N];
bool vis[N];
priority_queue > q;
int hd[N], nt[M], to[M], w[M], tot;
inline void add(int u, int v, int c)
{
	nt[++tot] = hd[u];
	hd[u] = tot;
	to[tot] = v;
	w[tot] = c;
}
inline void Dijkstra(int s)
{
	for(int i = 1; i <= n; ++i) dis[i] = inf;
	dis[s] = 0;
	q.push(make_pair(0, s));
	int u, v;
	while(!q.empty())
	{
		u = q.top().second; q.pop();
		if(vis[u]) continue; //very important
		vis[u] = true;
	    for(int e = hd[u]; e; e = nt[e])
	    {
	    	if(!vis[v = to[e]] && dis[v] > dis[u] + w[e])
	    	{
	    		dis[v] = dis[u] + w[e];
	    		q.push(make_pair(-dis[v], v));
			}
		}
	}
	for(int i = 1; i <= n; ++i) cout << dis[i] << ' ';
}
int main()
{
    scanf("%d%d%d", &n, &m, &s);
    for(int i = 1, u, v, c; i <= m; ++i) 
	    scanf("%d%d%d", &u, &v, &c), add(u, v, c);
	Dijkstra(s);
	return 0;
}