怎么标准版的ac 弱化版的只有90分了
查看原帖
怎么标准版的ac 弱化版的只有90分了
1021623
AVLw楼主2023/11/14 13:33

这么奇怪 求解释 同样赏关注

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int N = 5e5 + 10, INF = 0x3f3f3f3f;
struct edge {
	int v, w;
};
vector<edge> e[N];
int d[N], vis[N];  //d[i]表示源点到i点最短距离 ,vis表示是否从小根堆弹出过
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap;

int main() {
	int n, m, s;
	scanf("%d%d%d", &n, &m, &s);
    //邻接表建图
	for (int i = 0; i < m; i++) {
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		e[u].push_back({ v,w });
	}
	for (int i = 1; i <= n; i++) {
		d[i] = INF;
	}
	d[s] = 0;  //源点初始化为0
	heap.push({ 0,s });
	while (!heap.empty()) {
		auto u = heap.top().second;
		heap.pop();
		if (vis[u])
			continue;
		vis[u] = true;
		for (auto& ed : e[u]) {
		//first:源点到节点距离
		//second:节点
			int v = ed.v;
			int w = ed.w;
			if (!vis[v] && d[u] + w < d[v]) {
				d[v] = d[u] + w;
				heap.push({ d[u] + w, v });
			}
		}
	}
	for (int i = 1; i <= n; i++)
		printf("%d ", d[i]);
}
2023/11/14 13:33
加载中...