Cod sursa(job #5561)

Utilizator MariusMarius Stroe Marius Data 13 ianuarie 2007 10:38:02
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#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;
}