求助:除 Hack #1#2#3#4 外全部 RE
查看原帖
求助:除 Hack #1#2#3#4 外全部 RE
365751
Mr_罗楼主2024/10/31 07:33

RT

#include <bits/stdc++.h>
using namespace std;

// #define CF

#define ll long long
#define ul unsigned ll
#define LL __int128_t
#define db double
#define DB long db
#define pii pair<int, int>
#define fi first
#define se second
#define mkpr make_pair
#define mem(a, x) memset(a, x, sizeof(a))
#define rep(i, l, r) for (int i(l), i##End(r); i <= i##End; i = -~i)
#define per(i, r, l) for (int i(r), i##End(l); i >= i##End; i = ~-i)

template<typename T, typename U> void chkmx(T &_a, U _b) { if (_a < _b) _a = _b; }
template<typename T, typename U> void chkmn(T &_a, U _b) { if (_a > _b) _a = _b; }

constexpr int N = 50005, M = 500005;
constexpr ll mod = 998244353, INF = 0x3f3f3f3f3f3f3f3f;
int n, m, s, k, ans;
struct edge { int u, v, w; } e[M];
int fa[N], wt[N];
multiset<int> S;

int fdrt(int i) { return i == fa[i] ? i : fa[i] = fdrt(fa[i]); }

void solve() {
    scanf("%d%d%d%d", &n, &m, &s, &k);
    rep(i, 1, m) scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
    rep(i, 1, n) fa[i] = i, wt[i] = INF;
    rep(i, 1, m) if (e[i].u == s || e[i].v == s) {
        if (e[i].u == s) wt[e[i].v] = e[i].w;
        else wt[e[i].u] = e[i].w;
    } sort(e + 1, e + m + 1, [](edge a, edge b) { return a.w < b.w; } );
    rep(i, 1, n) if (wt[i] != (int)INF) S.insert(wt[i]);
    rep(i, 1, m) {
        auto [u, v, w] = e[i];
        if (u == s || v == s) continue;
        if (u = fdrt(u), v = fdrt(v); u == v) continue;
        ans += w, fa[u] = v, S.erase(S.find(max(wt[u], wt[v]))), chkmn(wt[v], wt[u]);
        if (S.size() == k) break;
    } if (S.size() != k) { puts("Impossible"); return; }
    for (auto x : S) ans += x;
    printf("%d\n", ans);
}

void init() {}

int main() {
    init();
    #ifdef CF
    int _; scanf("%d", &_);
    while (_--) solve();
    #else
    solve();
    #endif
    return 0;
}
2024/10/31 07:33
加载中...