莫名RE 0求条
查看原帖
莫名RE 0求条
1013955
1234567890sjx楼主2023/5/27 16:27
#include <bits/stdc++.h>
#define x first
#define y second
#define int long long
using namespace std;
const int N = 1e5 + 10;
double dis[N][88]; bool vis[N][88];
vector<pair<int, int> > z[N];
double solve(signed n, signed m, signed k, signed h, std::vector<signed> x, std::vector<signed> y, std::vector<signed> c, std::vector<signed> arr) {
	h++;
	k = min(k, 85);
	for (int i = 1; i <= n; i++) {
		z[i].clear();
	}
	for (int i = 0; i < m; i++) {
		int u = x[i], v = y[i], w = c[i];
		u++, v++;
		z[u].push_back({v, w}), z[v].push_back({u, w});
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < k; j++) {
			dis[i][j] = 1e9;
		}
	}
	queue<pair<int, int> > q; q.push({1, 0}); dis[1][0] = 0; vis[1][0] = false;
	while (q.size()) {
		pair<int, int> f = q.front(); q.pop(); vis[1][0] = false;
		for (int i = 0; i < z[f.x].size(); i++) {
			int g = z[f.x][i].first, w = z[f.x][i].second;
			if (arr[g - 1] == 1) {
				if (dis[g][f.y] > dis[f.x][f.y] + w) {
					dis[g][f.y] = dis[f.x][f.y] + w;
					if (!vis[g][f.y]){
						q.push({g, f.y});
						vis[g][f.y] = true;
					}
				}
			} else if (arr[g - 1] == 0) {
				dis[g][f.y] = 0;
				if (!vis[g][f.y]) {
					q.push({g, f.y});
					vis[g][f.y] = true;
				}
			} else {
				if (dis[g][f.y] > dis[f.x][f.y] + w) {
					dis[g][f.y] = dis[f.x][f.y] + w;
					if (!vis[g][f.y]) {
						q.push({g, f.y});
						vis[g][f.y] = true;
					}
				}
				if (f.y != k - 1 && dis[g][f.y + 1] > (dis[f.x][f.y] + w) / 2.) {
					dis[g][f.y + 1] = (dis[f.x][f.y] + w) / 2.;
					if (!vis[g][f.y + 1]) {
						q.push({g, f.y + 1});
						vis[g][f.y + 1] = true;
					}
				}
			}
		}
	}
	double mx = 1e9;
	for (int i = 0; i < k; i++) {
		mx = min(mx, dis[h][i]);
	}
	if (mx < 1e-8) {
		mx = 0;
	}
	return mx;
}
signed main() {
	cout << solve(4, 4, 99990, 3, {0, 0, 1, 2}, {1, 2, 3, 3}, {5, 3, 0, 4}, {1, 2, 0, 1}) << '\n';
	return 0;
}

2023/5/27 16:27
加载中...