各位帮我看一下,好像是可以用 Dijkstra 做的,可是只有 30 pts
  • 板块P1396 营救
  • 楼主ZYK_luogu
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/9 16:21
  • 上次更新2023/11/3 04:56:49
查看原帖
各位帮我看一下,好像是可以用 Dijkstra 做的,可是只有 30 pts
742157
ZYK_luogu楼主2023/8/9 16:21
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int N = 10005;
struct Edge {
	int v, w;
	Edge(int _v, int _w) {
		v = _v, w = _w;
	}
}; 
int n, m, s, t;
int vis[N], maxv[N];
vector<Edge> p[N];
void dijkstra() {
	memset(maxv, 0x3f, sizeof maxv);
	maxv[s] = 0;
	for(int i = 0; i < n; i ++) {
		int k = -1;
		for(int j = 1; j <= n; j ++) 
			if(!vis[j] && (k == -1 || maxv[j] < maxv[k]))
				k = j;
		vis[k] = 1;
		for(int j = 0, siz = p[k].size(); j < siz; j ++) {
			int v = p[k][j].v, w = p[k][j].w;
			if(maxv[k] == 0) maxv[v] = w;
			else maxv[v] = min(maxv[v], maxv[k]);
		}
	}
}
int main() {
	scanf("%d%d%d%d", &n, &m, &s, &t);
	for(int i = 0; i < m; i ++) {
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		p[u].push_back(Edge(v, w));
		p[v].push_back(Edge(u, w));
	}
	dijkstra();
	printf("%d", maxv[t]);
	return 0;
}

就是把长度相加换成了取最大值而已

2023/8/9 16:21
加载中...