萌新泪眼汪汪求条简单小红题
查看原帖
萌新泪眼汪汪求条简单小红题
565707
mediocre_楼主2024/8/24 18:53
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
int n, m, dis[2][MAXN];
struct Node {
	int pos, dis;
	friend bool operator<(Node a, Node b) {
		return a.dis > b.dis;
	}
} ;
vector <Node> p[MAXN]; 
priority_queue <Node> q;
void dijkstra() {
	for (int i = 1; i <= n; ++i)
		dis[0][i] = dis[1][i] = INT_MAX;
	dis[0][1] = 0;
	q.push({1, 0});
	while (!q.empty()) {
		Node u = q.top();
		q.pop();
		for (int i = 0; i < p[u.pos].size(); ++i) {
			int to = p[u.pos][i].pos;
			int w = p[u.pos][i].dis;
			// 如果这条路径小于最短路
			if (dis[0][to] > u.dis + w) {
				dis[1][to] = dis[0][to]; // 那这个原来的最短路就成了次短路
				dis[0][to] = u.dis + w; // 更新最短路
				q.push({to, dis[0][to]});
			}
			else if (dis[1][to] > u.dis + w) { // 否则继续判断如果这条路小于次短路
				dis[1][to] = u.dis + w; // 更新次短路
				q.push({to, dis[1][to]});
			}
		}
	}
}
int main() {
	scanf("%d%d", &n, &m);
	while (m--) {
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		p[u].push_back({v, w});
		p[v].push_back({u, w});
	}
	dijkstra();
	printf("%d", dis[1][n]);
	return 0;
}

不太懂为什么HACK的点WA了

2024/8/24 18:53
加载中...