社区讨论

20pts求条

P14318「ALFR Round 11」B 行走 (walk)参与者 4已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mhizlj2w
此快照首次捕获于
2025/11/03 18:18
4 个月前
此快照最后确认于
2025/11/03 18:18
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 1e5 + 10;
const int INF = 0x3f3f3f3f3f3f3f3f;
vector <int> adj[MAXN];
int n, m, s[2], e[2];
int dis[2][MAXN], k;
bool vis[MAXN];
void dijkstra(int o){
	memset(dis[o], 0x3f, sizeof(dis[o]));
	memset(vis, false, sizeof(vis));
	dis[o][s[o]] = 0;
	priority_queue <pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
	q.push({0, s[o]});
	while (!q.empty()){
		int d = q.top().first;
		int u = q.top().second;
		q.pop();
		if (vis[u]){
			continue;
		}
		vis[u] = true;
		for (int v:adj[u]){
			if (dis[o][v] > dis[o][u] + 1){
				dis[o][v] = dis[o][u] + 1;
				q.push({dis[o][v], v});
			}
		}
	}
	return;
}
void solve(){
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++){
		adj[i].clear();
	}
	for (int i = 1; i <= m; i++){
		int u, v;
		cin >> u >> v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	cin >> s[0] >> e[0] >> s[1] >> e[1];
	dijkstra(0);
	dijkstra(1);
	int sum = dis[0][e[0]] + dis[1][e[1]];
	if (dis[0][e[0]] > m || dis[1][e[1]] > m){
		cout << "-1" << endl;
		return;
	}
	if (sum == 0){
		cout << sum << endl;
		return;
	}
	int l = k / sum, r = k % sum;
	double ans = 1.0 / (2 + l) * r + 1.0 / (1 + l) * (sum - r);
	printf("%.12lf\n", ans);
	return;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while (t--){
		solve();
	}
	return 0;
}
wa on sub 1, 4, 5, 6, 7, 8.

回复

8 条回复,欢迎继续交流。

正在加载回复...