Pagini recente »
Istoria paginii utilizator/anisia
|
Istoria paginii runda/2015-04-02-test-7b
|
Monitorul de evaluare
|
Istoria paginii utilizator/marcoazar
|
Cod sursă (job #521946)
Cod sursă (job
#521946)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("zapada.in");
ofstream fout ("zapada.out");
void usain_bolt()
{
ios::sync_with_stdio(false);
fin.tie(0);
}
const int N = 1e4 + 5;
struct edge
{
short x, y;
int w;
bool operator < (const edge & nxt) const
{
return w < nxt.w;
}
};
vector < edge > muchii, add, to_add;
vector < bool > modify(N);
short parent[N], Size[N], Tryparent[N], TrySize[N];
long long ans, base_ans;
void init(short k)
{
Size[k] = 1;
parent[k] = k;
}
void Tryinit(short k)
{
TrySize[k] = Size[k];
Tryparent[k] = parent[k];
}
short find_set(short k)
{
if(parent[k] != k) return parent[k] = find_set(parent[k]);
return k;
}
short Tryfind_set(short k)
{
if(Tryparent[k] != k) return Tryparent[k] = Tryfind_set(Tryparent[k]);
return k;
}
void union_sets(short a, short b)
{
a = find_set(a), b = find_set(b);
if(a != b) {
if(Size[b] > Size[a]) swap(a, b);
Size[a] += Size[b];
parent[b] = a;
}
}
void Tryunion_sets(short a, short b)
{
a = Tryfind_set(a), b = Tryfind_set(b);
if(a != b) {
if(TrySize[b] > TrySize[a]) swap(a, b);
TrySize[a] += TrySize[b];
Tryparent[b] = a;
}
}
int main()
{
usain_bolt();
int n, m, q;
fin >> n >> m >> q;
for(int i = 1; i <= m; ++i) {
short x, y;
int w;
fin >> x >> y >> w;
muchii.push_back({x, y, w});
}
add.push_back({0, 0, (int) 2e9});
for(int i = 1; i <= q; ++i) {
short x, y;
int w;
fin >> x >> y >> w;
add.push_back({x, y, w});
modify[x] = true, modify[y] = true;
}
for(int i = 1; i <= n; ++i) init(i);
sort(muchii.begin(), muchii.end());
for(auto v : muchii) {
if((modify[v.x] | modify[v.y]) == 0) {
if(find_set(v.x) != find_set(v.y)) {
union_sets(v.x, v.y);
base_ans += 1LL * v.w;
}
}
else to_add.push_back(v);
}
for(int i = 0; i <= q; ++i) {
for(int j = 1; j <= n; ++j) Tryinit(j);
to_add.push_back(add[i]);
sort(to_add.begin(), to_add.end());
ans = base_ans;
for(auto v : to_add) {
if(Tryfind_set(v.x) != Tryfind_set(v. y)) {
Tryunion_sets(v.x, v.y);
ans += v.w;
}
}
fout << ans << "\n";
}
return 0;
}