二分答案+Dijkstra WA求助
查看原帖
二分答案+Dijkstra WA求助
923248
Lian_zy楼主2023/12/14 12:13
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 1e3 + 10, maxm = 2e5 + 10;
struct edge {
	int x, y, z;
} a[maxm];
bool vis[maxn];
int n, p, k, l, r, mid, minn, temp, ans, dis[maxn], mp[maxn][maxn];
void Dijkstra(int u) {
	vis[u] = true;
	for (int i = 1; i <= n; i++) dis[i] = mp[u][i];
	for (int k = 1; k + 1 <= n; k++) {
		minn = 0x3f3f3f3f, temp = -1;
		for (int i = 1; i <= n; i++) {
			if (vis[i] || dis[i] >= minn) continue;
			minn = dis[i];
			temp = i;
		}
		if (~temp) {
			vis[temp] = true;
			for (int i = 1; i <= n; i++) {
				if (vis[i] || mp[temp][i] == 0x3f3f3f3f) continue;
				dis[i] = min(dis[i], mp[temp][i] + dis[temp]);
			}
		} else break;
	}
	return ;
}
bool check(int x) {
	memset(vis, false, sizeof(vis));
	memset(mp, 0x3f, sizeof(mp));
	for (int i = 1; i <= n; i++) mp[i][i] = 0;
	for (int i = 1; i <= p; i++) mp[a[i].x][a[i].y] = a[i].z > x;
	Dijkstra(1);
	return dis[n] <= k;
}
int main() {
	scanf("%d %d %d", &n, &p, &k);
	for (int i = 1; i <= p; i++) scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].z);
	r = 1e6;
	while (l <= r) {
		mid = l + r >> 1;
		if (check(mid)) {
			ans = mid;
			r = mid - 1;
		} else l = mid + 1;
	}
	printf("%d\n", ans);
	return 0;
}
2023/12/14 12:13
加载中...