Pagini recente »
Istoria paginii runda/martie6_1/clasament
|
Borderou de evaluare (job #201316)
|
Istoria paginii runda/2024-04-05-clasa-5-tema-36/clasament
|
Istoria paginii runda/2015-11-19-clasa-7-tema-10
|
Cod sursă (job #625496)
Cod sursă (job
#625496)
// #include <iostream>
// #include <fstream>
#include <stdio.h>
#include <algorithm>
using namespace std;
// ifstream fin("zapada.in");
// ofstream fout("zapada.out");
int n, m, k, a, b, c, edgesCnt, root[10005];
pair<int, pair<int, int>> edges[101005];
void link(int x, int y)
{
root[y] = x;
}
int getRoot(int x)
{
if ( x != root[x] )
root[x] = getRoot(root[x]);
return root[x];
}
int kruskal()
{
int cost = 0, cnt = 0, ck = 0;
for ( int i = 1; i <= n; i++ )
root[i] = i;
for ( int i = 1; i <= edgesCnt; i++ )
{
a = getRoot(edges[i].second.first);
b = getRoot(edges[i].second.second);
if ( a != b )
{
link(a, b);
edges[++ck] = edges[i];
cost += edges[i].first;
cnt++;
if ( cnt == n - 1 )
break;
}
}
edgesCnt = n - 1;
return cost;
}
int main()
{
freopen("zapada.in", "r", stdin);
freopen("zapada.out", "w", stdout);
scanf("%d %d %d", &n, &m, &k);
// fin >> n >> m >> k;
for ( int i = 1; i <= m; i++ )
{
// fin >> a >> b >> c;
scanf("%d %d %d", &a, &b, &c);
edges[++edgesCnt] = { c, {a, b} };
}
sort(edges + 1, edges + m + 1);
printf("%d\n", kruskal());
// fout << kruskal() << "\n";
for ( int i = 1; i <= k; i++ )
{
// fin >> a >> b >> c;
scanf("%d %d %d", &a, &b, &c);
edges[++edgesCnt] = { c, {a, b} };
for ( int i = edgesCnt; i > 1; i-- )
if ( edges[i] < edges[i - 1] )
swap(edges[i], edges[i - 1]);
else
break;
// fout << kruskal() << "\n";
printf("%d\n", kruskal());
}
}