Pagini recente » Cod sursa (job #1791099) | Cod sursa (job #1158197) | Cod sursa (job #2619486) | Cod sursa (job #1496482) | Cod sursa (job #5561)
Cod sursa(job #5561)
#include <cstdio>
#include <memory>
using namespace std;
const char iname[] = "flood.in";
const char oname[] = "flood.out";
#define MAX_N 10005
#define MAX_M 200005
#define MAX_C 1005
struct entry {
int u, v;
int cost;
} L[MAX_M];
int T[MAX_N], H[MAX_N], X[MAX_M];
bool issol[MAX_M];
int find(const int x)
{
if (x != T[x]) T[x] = find(T[x]);
return T[x];
}
void uniq(int x, int y)
{
x = T[x];
y = T[y];
if (H[y] < H[x])
T[y] = x;
else {
T[x] = y;
if (H[x] == H[y])
H[y]++;
}
}
void sort(entry L[], int n)
{
int cnt[MAX_C], i;
memset(cnt, 0, sizeof(cnt));
for (i = 0; i < n; ++i)
cnt[L[i].cost] += 1;
for (i = 1; i < MAX_C; ++i)
cnt[i] += cnt[i - 1];
for (i = 0; i < n; ++i)
X[-- cnt[L[i].cost]] = i;
}
int main(void)
{
freopen(iname, "r", stdin);
freopen(oname, "w", stdout);
int N;
int M;
int i, u, v;
int sum = 0, cnt = 0;
for (scanf("%d", & N), i = 1; i <= N; ++i)
T[i] = i;
for (scanf("%d", & M), i = 0; i < M; ++i) {
scanf("%d %d", & u, & v);
if (find(u) != find(v))
uniq(u, v);
}
for (scanf("%d", & M), i = 0; i < M; ++i)
scanf("%d %d %d", & L[i].u, & L[i].v, & L[i].cost);
sort(L, M);
for (i = 0; i < M; ++i) {
if (find(L[ X[i] ].u) != find(L[ X[i] ].v)) {
uniq(L[ X[i] ].u, L[ X[i] ].v);
cnt += 1;
sum += L[ X[i] ].cost;
issol[ X[i] ] = true;
}
}
printf("%d\n", cnt);
printf("%d\n", sum);
for (i = 0; i < M; ++i)
if (issol[i]) printf("%d %d %d\n", L[i].u, L[i].v, L[i].cost);
return 0;
}