蒟蒻求助 wa点3 标准版全过
查看原帖
蒟蒻求助 wa点3 标准版全过
1206518
Nervegas楼主2024/7/12 08:18
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 600010;

struct edge{//用于存图; 
	int to;
	int dis;
	edge(int a,int b){
		to = a;
		dis = b;
	}
};
struct node{//用于建堆; 
	int x;
	int len;
	node(int a,int b){
		x = a;
		len = b;
	}
};

bool operator < (const node &a,const node &b){
	return a.len > b.len;//建立小根堆
	//return a.len < b.len建立大根堆; 
} 

int n,m,s;
int dis[N];
vector<edge> g[N];
int v[N];
priority_queue<node> que;//堆;

void Dijkstra(int s){
	memset(dis,0x3f,sizeof(dis));
	dis[s] = 0;
	que.push(node(s,dis[s]));
	while(!que.empty()){
		int x = que.top().x;
		que.pop();
		if(v[x] == 0){
			v[x] = 1;
			for(int i = 0 ; i < g[x].size() ; i++){
				int y = g[x][i].to;
				int w = g[x][i].dis;
				if(dis[y] > dis[x] + w){
					dis[y] = dis[x] + w;
					que.push(node(y,dis[y]));
				}
			}
		}
	}
} 
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin >> n >> m >> s;
	for(int i = 1 ; i <= m ; i++){
		int u,v,w;
		cin >> u >> v >> w;
		g[u].push_back(edge(v,w));
	}
	Dijkstra(s);
	for(int i = 1 ; i <= n ; i++){
		cout << dis[i] << " ";
	}
	cout << endl;
	return 0; 
}
2024/7/12 08:18
加载中...