1. 程式人生 > 實用技巧 >【模板】單源最短路徑(Dijkstra)/洛谷P4779

【模板】單源最短路徑(Dijkstra)/洛谷P4779

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e5+5;
int n, m, s, dis[N];
priority_queue <pair<int, int>, vector <pair<int, int> >, greater<pair<int, int> > > q;
vector <pair<int, int> > e[N];

inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
void Dijkstra()
{
    dis[s] = 0;
	q.push(make_pair(0, s));
    while (!q.empty()){
        int a = q.top().second, c = q.top().first;
		q.pop();
        if (c != dis[a]) continue;
        for (int i=0; i<e[a].size(); i++){
			int b = e[a][i].second;
            if (dis[b] > dis[a]+e[a][i].first){
                dis[b] = dis[a]+e[a][i].first;
                q.push(make_pair(dis[b], b));
            }
        }
    }
}
int main() 
{
    int a, b, c;
	n=read(), m=read(), s=read();
	for (int i=0; i<m; ++i) {
		a=read(), b=read(), c=read();
		e[a].push_back(make_pair(c, b));
	}
	for (int i=1; i<=n; ++i) dis[i] = INF;
    Dijkstra();
    for (int i=1; i<=n; ++i) printf("%d ", dis[i]);
    putchar('\n');
    return 0;
}