社区讨论
求证假
P4316绿豆蛙的归宿参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m2jti2qr
- 此快照首次捕获于
- 2024/10/22 10:19 去年
- 此快照最后确认于
- 2024/10/22 14:38 去年
rt。思路是统计每一条边的出现的概率,加之以边权再求和。
CPP#include <bits/stdc++.h>
#define int long long
const int N = 1e5 + 10;
int n, m;
struct node { int to, w; };
std::vector <node> G[N];
std::vector <int> g1[N], g2[N];
int dp1[N], dp2[N], in1[N], in2[N];
signed main() {
std::cin >> n >> m;
for (int i = 1; i <= m; ++ i) {
int u, v, w; std::cin >> u >> v >> w;
G[u].push_back((node) {v, w}), ++ in1[v], ++ in2[u];
g1[u].push_back(v), g2[v].push_back(u);
}
auto tps1 = [&](int s) {
std::queue <int> q;
dp1[s] = 1, q.push(s);
while (!q.empty()) {
int u = q.front(); q.pop();
for (auto v : g1[u]) {
dp1[v] += dp1[u];
if (-- in1[v] == 0) q.push(v);
}
}
return void();
};
auto tps2 = [&](int s) {
std::queue <int> q;
dp2[s] = 1, q.push(s);
while (!q.empty()) {
int u = q.front(); q.pop();
for (auto v : g2[u]) {
dp2[v] += dp2[u];
if (-- in2[v] == 0) q.push(v);
}
}
return void();
};
tps1(1), tps2(n);
double ans = 0;
for (int u = 1; u <= n; ++ u)
for (int i = 0; i < G[u].size(); ++ i) {
int v = G[u][i].to, w = G[u][i].w;
double t = 1.0 * dp1[u] * dp2[v] / dp1[n];
ans += t * w;
}
printf("%.2lf\n", ans);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...