Pagini recente »
Monitorul de evaluare
|
Istoria paginii utilizator/katy_mun
|
Monitorul de evaluare
|
Monitorul de evaluare
|
Cod sursă (job #675966)
Cod sursă (job
#675966)
#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;
}