比赛 T1
  • 板块学术版
  • 楼主Micnation_AFO
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/12/25 18:07
  • 上次更新2023/10/24 06:38:44
查看原帖
比赛 T1
574944
Micnation_AFO楼主2022/12/25 18:07

写了图为链的部分,早早写完结果调试 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 就行,谢谢了

2022/12/25 18:07
加载中...