写了图为链的部分,早早写完结果调试 1h 无果,当时心态直接崩了。
#include <iostream>
#include <vector>
#include <cmath>
#include <assert.h>
using namespace std;
#define int long long
const int N = 200010;
const int M = 2010;
int n, m;
int s, b, f;
vector<pair<int, double> > map[N];
namespace bf {
int tot = 0;
int a[N], v[N], root;
double sum[N];
int deg[N];
void dfs(int x, int fa) {
for (auto it : map[x]) {
if (it.first == fa) continue;
a[++tot] = it.first; v[tot] = it.second;
dfs(it.first, x);
}
}
void solve_chains() {
for (int i = 1; i <= n; i++)
for (auto it : map[i]) deg[it.first]++;
for (int i = 1; i <= n; i++)
if (deg[i] == 1) root = i;
dfs(root, -1);
int id_s, id_b, id_f;
if (root == s) id_s = 0;
if (root == b) id_b = 0;
if (root == f) id_f = 0;
for (int i = 1; i < n; i++) {
if (a[i] == s) id_s = i;
if (a[i] == b) id_b = i;
if (a[i] == f) id_f = i;
}
for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + v[i];
double A = abs(sum[id_s] - sum[id_f]), B = abs(sum[id_b] - sum[id_f]);
bool flag1, flag2;
if (id_s <= id_f) flag1 = false;
else flag1 = true;
if (id_b <= id_s) flag2 = false;
else flag2 = true;
if (A * 3 < B * 2) {
puts("YES");
cout << B - A / 2.0 * 3.0 << "\n";
}
else {
A = sum[id_s], B = sum[id_b];
puts("NO");
if (flag1 != flag2) cout << abs(B - A) / 5.0 << "\n";
else cout << abs(A - B) / 1.0 << "\n";
}
}
}
signed main() {
cin >> n >> m;
cin >> s >> b >> f;
for (int i = 1; i <= m; i++) {
int u, v, w; cin >> u >> v >> w;
map[u].push_back(make_pair(v, w));
map[v].push_back(make_pair(u, w));
}
if (n == m + 1) {
bf::solve_chains();
return 0;
}
assert(false);
return 0;
}
代码很丑,给个 hack 就行,谢谢了