Cod sursă (job #521928)

Utilizator avatar BogdanRazvan Bogdan Razvan BogdanRazvan IP ascuns
Problemă Zapada (clasele 11 și 12) Compilator cpp | 2,41 kb
Rundă Arhiva de probleme Status evaluat
Dată 25 ian. 2020 14:30:54 Scor 40
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("zapada.in");
ofstream fout ("zapada.out");

void usain_bolt()
{
    ios::sync_with_stdio(false);
    fin.tie(0);
}

const int N = 1e4 + 5;

struct edge
{
    int x, y, w;

    bool operator < (const edge & nxt) const
    {
        return w < nxt.w;
    }
};

vector < edge > muchii, add, to_add;
vector < bool > modify(N);

short parent[N], Size[N], Tryparent[N], TrySize[N];
long long ans, base_ans;

void init(int k)
{
    Size[k] = 1;
    parent[k] = k;
}

void Tryinit(int k)
{
    TrySize[k] = Size[k];
    Tryparent[k] = parent[k];
}

short find_set(int k)
{
    if(parent[k] != k) return parent[k] = find_set(parent[k]);
    return k;
}

short Tryfind_set(int k)
{
    if(Tryparent[k] != k) return Tryparent[k] = Tryfind_set(Tryparent[k]);
    return k;
}

void union_sets(int a, int b)
{
    a = find_set(a), b = find_set(b);
    if(a != b) {
        if(Size[b] > Size[a]) swap(a, b);
        Size[a] += Size[b];
        parent[b] = a;
    }
}

void Tryunion_sets(int a, int b)
{
    a = Tryfind_set(a), b = Tryfind_set(b);
    if(a != b) {
        if(TrySize[b] > TrySize[a]) swap(a, b);
        TrySize[a] += TrySize[b];
        Tryparent[b] = a;
    }
}

int main()
{
    usain_bolt();

    int n, m, q;

    fin >> n >> m >> q;
    for(int i = 1; i <= m; ++i) {
        int x, y, w;

        fin >> x >> y >> w;
        muchii.push_back({x, y, w});
    }

    add.push_back({0, 0, (int) 2e9});

    for(int i = 1; i <= q; ++i) {
        int x, y, w;

        fin >> x >> y >> w;
        add.push_back({x, y, w});
        modify[x] = true, modify[y] = true;
    }

    for(int i = 1; i <= n; ++i) init(i);

    sort(muchii.begin(), muchii.end());

    for(auto v : muchii) {
        if((modify[v.x] | modify[v.y]) == 0) {
            union_sets(v.x, v.y);
            base_ans += 1LL * v.w;
        }
        else to_add.push_back(v);
    }
    for(int i = 0; i <= q; ++i) {

        for(int j = 1; j <= n; ++j) Tryinit(j);

        to_add.push_back(add[i]);
        sort(to_add.begin(), to_add.end());
        ans = base_ans;

        for(auto v : to_add) {
            if(Tryfind_set(v.x) != Tryfind_set(v. y)) {
                Tryunion_sets(v.x, v.y);
                ans += v.w;
            }
        }

        fout << ans << "\n";
    }
    return 0;
}