y总板子(dijkstra),3个点tle,48分求调
查看原帖
y总板子(dijkstra),3个点tle,48分求调
552755
LagSuc楼主2025/2/3 01:02
#include<bits/stdc++.h>

using namespace std;

const int N = 100010, M = 200010;
int n, m, s;
int dist[N], st[N];
int h[N], idx, e[M], ne[M], w[M];

using PII = pair<int, int>;

void add(int a, int x, int b){
	e[idx] = x, w[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

void dijkstra(){
	memset(dist, 0x3f, sizeof dist);
	dist[s] = 0;
	
	priority_queue<PII, vector<PII>, greater<PII>> heap;
	heap.push({0, s});
	
	while(!heap.empty()){
		auto t = heap.top();
		heap.pop();
		
		int ver = t.second, distance = t.first;
		if(st[ver]) continue;
		
		for(int i = h[ver]; i != -1; i = ne[i]){
			int j = e[i];
			if(dist[j] > w[i] + distance)
			{
				dist[j] = w[i] + distance;
				heap.push({dist[j], j});
			}
		}
	}
}

int main(){
	memset(h, -1, sizeof h);
	cin >> n >> m >> s;
	for(int i = 1; i <= m; i ++ ){
		int _, __, ___;
		cin >> _ >> __ >> ___;
		add(_, __, ___);
	}
	
	dijkstra();
	
	for(int i = 1; i <= n; i ++ )
		cout << dist[i] << " ";
}
2025/2/3 01:02
加载中...