Pagini recente »
OJI 2023 Clasa a VI-a - Antrenament - FFA v2.1
|
probleme-frumoase-si-dragute
|
OJI 2023 Clasa a VI-a - Antrenament FFA - Partea a doua
|
Istoria paginii runda/2022-07-04-tabara20222/clasament
|
Cod sursă (job #521682)
Cod sursă (job
#521682)
#include <bits/stdc++.h>
using namespace std;
struct edge{
int x, y, c;
bool operator < (const edge &aux)const{
return c < aux.c;
}
};
int n, m, k;
int TT[10005], RG[10005];
edge a[100005];
edge b[11005];
inline int find(int x){
int R = x;
while(R != TT[R]) R = TT[R];
while(TT[x] != R){
int aux = TT[x];
TT[x] = R;
x = aux;
}
return R;
}
inline void unite(int x, int y){
if(RG[x] > RG[y]) TT[y] = x;
else if(RG[x] < RG[y]) TT[x] = y;
else ++RG[x], TT[y] = x;
}
void apm(int m){
for(int i = 1; i <= n ; ++i) TT[i] = i, RG[i] = 1;
sort(b + 1, b + m + 1);
int Sum = 0;
for(int i = 1; i <= m ; ++i){
int x = find(b[i].x), y = find(b[i].y);
if(x == y) continue ;
Sum = Sum + b[i].c;
unite(x, y);
}
printf("%d\n", Sum);
}
int main(){
freopen("zapada.in", "r", stdin);
freopen("zapada.out", "w", stdout);
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= m ; ++i)
scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].c);
for(int i = 1; i <= n ; ++i) TT[i] = i, RG[i] = 1;
sort(a + 1, a + m + 1);
int Sum = 0, NR = 0;
for(int i = 1; i <= m ; ++i){
int x = find(a[i].x), y = find(a[i].y);
if(x == y) continue ;
Sum = Sum + a[i].c;
unite(x, y);
b[++NR] = a[i];
}
printf("%d\n", Sum);
for(int i = 1; i <= k ; ++i){
++NR;
scanf("%d%d%d", &b[NR].x, &b[NR].y, &b[NR].c);
apm(NR);
}
return 0;
}