Cod sursă (job #675966)

Utilizator avatar DKMKD Matei Filibiu DKMKD IP ascuns
Problemă Zapada (clasele 11 și 12) Compilator cpp-32 | 1.55 kb
Rundă Arhiva de probleme Status evaluat
Dată 15 nov. 2022 19:32:08 Scor 0
#include <bits/stdc++.h>
#include <unordered_map>
#define pb push_back
#define N 105

using namespace std;

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

int n, m, k, x, y, z, cost;
vector < pair<int, pair<int, int>>>edg;
map<pair<int, int>, int>mrk;
int t[N];
void read() {
    fin >> n >> m;
    for (int i = 1; i <= m; ++i) {
        fin >> x >> y >> z;
        edg.pb({ z,{x,y} });
    }
}
void Union(int x, int y) {
    t[y] = x;
}
int Find(int x) {
    int rad = x, y;
    while (t[rad])
        rad = t[rad];
    while (x != rad) {
        y = t[x];
        t[x] = rad;
        x = y;
    }
    return rad;
}
bool Cauta(int x, int y) {
    if (mrk[{x, y}] == 1)
        return 1;
    return 0;
}
void Kruskal() {
    sort(edg.begin(), edg.end());
    for (int i = 0; i < edg.size(); ++i) {
        if (!Cauta(edg[i].second.first, edg[i].second.second)) {
            int r1 = Find(edg[i].second.first), r2 = Find(edg[i].second.second);
            if (r1 != r2) {
                Union(r1, r2);
                cost += edg[i].first;
            }
        }
    }
}
void solve() {
    fin >> k;
    for (int i = 1; i <= k; ++i) {
        fin >> x;
        mrk[{edg[x - 1].second.first, edg[x - 1].second.second}] = 1;
        int r1 = Find(edg[x - 1].second.first), r2 = Find(edg[x - 1].second.second);
        if (r1 != r2) {
            Union(r1, r2);
            cost += edg[x - 1].first;
        }
    }
    Kruskal();
    fout << cost;
}
int main() {
    read();
    solve();
    return 0;
}