結果

問題 No.748 yuki国のお財布事情
コンテスト
ユーザー 欧阳诚
提出日時 2025-12-26 23:04:27
言語 C++14
(gcc 15.2.0 + boost 1.89.0)
結果
AC  
実行時間 46 ms / 2,000 ms
コード長 1,584 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,719 ms
コンパイル使用メモリ 166,388 KB
実行使用メモリ 8,552 KB
最終ジャッジ日時 2025-12-26 23:04:31
合計ジャッジ時間 3,832 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 26
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m, k;
int tot = 0;

struct Edge
{
    int u, v, w;
    bool operator<(Edge R)
    {
        return w < R.w;
    }
} e[114514];
int cnt;
int fa[114514];
int h[114514];
int siz[114514];
void init(int n)
{
    cnt = n;
    for (int i = 1; i <= n; ++i)
    {
        fa[i] = i;
        siz[i] = 1;
        h[i] = 0;
    }
}
int find(int u)
{
    if (fa[u] == u)
        return u;
    return fa[u] = find(fa[u]);
}
void merge(int u, int v)
{
    u = find(u);
    v = find(v);
    if (u == v)
        return;
    if (h[u] < h[v])
    {
        fa[u] = v;
    }
    else
    {
        fa[v] = u;
        if (h[u] == h[v])
            h[u]++;
    }
    cnt--;
}
long long kur(int n, int m)
{
    sort(e + 1, e + m + 1);
    init(n);
    long long sum = 0;
    for (int i = 1; i <= m; ++i)
    {
        int u = e[i].u, v = e[i].v;
        if (find(u) == find(v))
        {
            continue;
        }
        merge(u, v);
        sum += e[i].w;
    }
    return (cnt > 1 ? -1 : sum);
}

signed main()
{
    // ifstream cin("cost.in");
    // ofstream cout("cost.out");
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m >> k;
    init(n);

    for (int i = 1; i <= m; ++i)
    {
        int a, b, c;
        cin >> a >> b >> c;
        e[++tot] = {a, b, c};
    }

    for (int i = 1; i <= k; ++i)
    {
        int x;
        cin >> x;
        e[x].w = 0;
    }

    int sumw = 0;
    for (int i = 1; i <= m; ++i)
    {
        sumw += e[i].w;
    }

    cout << sumw - kur(n, m);
}
0