dijkstra 50 分求调
  • 板块P1396 营救
  • 楼主apple666
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/4 15:24
  • 上次更新2024/9/4 20:16:02
查看原帖
dijkstra 50 分求调
1024377
apple666楼主2024/9/4 15:24
#include <bits/stdc++.h>
using namespace std;

#define int long long
typedef pair<int, int> pii;
const int mod = 998244353;
const int N = 1e6 + 10;

struct node {
	int place;
	int d;
};

// 比较器,优先队列实现最小堆
struct cmp {
	bool operator()(node a, node b) {
		return a.d < b.d; 
	}
};

int vis[10005], dis[10005];

void solve() {
	priority_queue<node, vector<node>, cmp> q;

	int n, m, beg, en;
	cin >> n >> m >> beg >> en;

	// 使用一个邻接表来表示图
	vector<vector<pii>> graph(n + 1);

	// 初始化距离
	fill(dis, dis + n + 1, LONG_LONG_MAX);
	dis[beg] = 0;

	// 输入边信息
	for (int i = 0; i < m; i++) {
		int xx, yy, d;
		cin >> xx >> yy >> d;
		graph[xx].push_back({yy, d});
		graph[yy].push_back({xx, d}); // 添加双向边
	}

	// 从起点开始
	q.push({beg, 0});

	while (!q.empty()) {
		int x = q.top().place;
		q.pop();

		if (vis[x] ) continue; // 如果已经访问,跳过
		vis[x] = 1;
		for (auto edge : graph[x]) {
			int y = edge.first;
			if (x == y)continue;
			int weight = edge.second;
			int k = max(dis[x], weight);
			if (k < dis[y]) {
				dis[y] = k; // 更新y的最短距离
				q.push({y, dis[y]});
			}
		}
	}

	// 输出从起点到终点的最短距离
	cout <<dis[en]<< endl;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int t = 1; // 测试用例数量
	// cin >> t; // 若有多个测试用例可取消注释
	while (t--) {
		solve();
	}
}
2024/9/4 15:24
加载中...