Pagini recente » Cod sursa (job #1339289) | Cod sursa (job #2264196) | Cod sursa (job #1334537) | Cod sursa (job #783734) | Cod sursa (job #3185978)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
struct edge
{
int x, y, c;
};
ifstream fin("zapada.in");
ofstream fout("zapada.out");
int n, m, k, rang[10005], d[10005], costT, x, y, c;;
vector<edge> edges, used;
inline int FindSet(int k){
int x = k;
while (d[k] != k) k = d[k];
while (d[x] != x) d[x] = k, x = d[x];
return k;
}
inline void DoUnion(int x, int y){
if(rang[x] > rang[y]) d[y] = x;
else if(rang[x] < rang[y]) d[x] = y;
else d[y] = x, rang[x]++;
}
bool cmp(edge a, edge b){
return a.c < b.c;
}
inline void Kruskal(int m){
int nrM = 0, cost = 0;
for(int i = 0; i < m; i++){
int x = FindSet(edges[i].x), y = FindSet(edges[i].y), c = edges[i].c;
if(x != y){
DoUnion(x, y);
cost += c;
nrM++;
used.push_back({x, y, c});
}
}
costT = cost;
}
inline void Init(){
for(int i = 1; i <= n; i++) d[i] = i, rang[i] = 1;
}
int main(){
fin >> n >> m >> k;
for(int i = 1; i <= m; i++){
fin >> x >> y >> c;
edges.push_back({x, y, c});
}
Init();
sort(edges.begin(), edges.end(), cmp);
Kruskal(edges.size());
fout << costT << '\n';
for(int i = 1; i <= k; i++){
fin >> x >> y >> c;
if(used.back().c > c){
Init();
used.push_back({x, y, c});
for(int i = used.size() - 1; i > 0; i--){
if(used[i].c < used[i - 1].c) swap(used[i], used[i - 1]);
else break;
}
edges = used;
used.clear();
Kruskal(n);
}
fout << costT << '\n';
}
return 0;
}