洛谷P4779 【模板】单源最短路径(标准版)

题链

#include <bits/stdc++.h>
using namespace std;
#define MS 100009
#define ls rt<<1
#define rs rt<<1|1
#define LL long long
#define MAXN 2147483647

int n,m;
int st;

struct node{
	int to,val;
};
vector<node > vc[MS];

struct nod{
	int poi,val;
};
priority_queue<nod > Q;
bool operator < (nod t1,nod t2){
	return t1.val > t2.val;
}
int dis[MS];
bool v[MS];

void dijkstra(){
	// 除了源点,其余初值为 MAXN 
	for(int i=1;i<=n;i++){
		v[i] = 0;
		dis[i] = MAXN;
	} 
	dis[st] = 0;
	
	Q.push({st,0});
	while(!Q.empty()){ // 选定权值最小的点,松弛其指向的点 
		nod x = Q.top();
		Q.pop();
		if(v[x.poi]) continue; 
		v[x.poi] = 1; 
		for(auto &it:vc[x.poi]){ //松弛 
			if(dis[it.to] > dis[x.poi] + it.val){
				dis[it.to] = dis[x.poi] + it.val;
				if(!v[it.to]){ // 未被访问 
					Q.push({it.to,dis[it.to]});
				}
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin >> n >> m >> st;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin >> u >> v >> w;
		vc[u].push_back({v,w});
	}
	
	dijkstra();
	
	for(int i=1;i<=n;i++){
		cout << dis[i] << " ";
	}
	cout << "\n";
	
	
	return 0;
}

posted @ 2021-04-15 16:31  棉被sunlie  阅读(53)  评论(0)    收藏  举报