Cod sursa(job #5566)

Utilizator gigi_becaliGigi Becali gigi_becali Data 13 ianuarie 2007 11:13:11
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <cstdio>
#include <vector>
#define pb push_back
#define sz size()
#include <algorithm>
#define maxn 10005
#define maxm 200005

using namespace std;

struct nod { int x, w,y; nod(int _x,int _y, int _w){ x=_x;y=_y; w=_w;}; nod(){};};
vector<vector<int> >a;

nod E[maxm];
bool viz[maxn];
int componenta[maxn], H;
int t[maxn], st[maxn], T;
int n, m, p, k;
int P;
int rang[maxn];
bool vz[maxm];
bool operator<(const nod &a, const nod &b)
{
	if(a.w<b.w) return 1;
	return 0;
}
void citire()
{	
	int i,xx, yy, w;
	freopen("flood.in", "r", stdin);
	scanf("%d\n", &n);
	a.resize(n+1);
	scanf("%d\n", &m);
	
	for(i=1;i<=m;i++)
	{
		
		scanf("%d %d\n", &xx, &yy);
		a[xx].pb(yy);
		a[yy].pb(xx);
	}
	scanf("%d\n", &p);
	for(i=1;i<=p;i++)
	{
		scanf("%d %d %d\n", &xx, &yy, &w);
		nod aux;
		aux.x=xx;
		aux.y=yy;
		aux.w=w;
		E[i]=aux;
	}
}

void dfs1(int nd)
{
	viz[nd]=1; componenta[nd]=k;
	t[nd]=T;
	for(int i=0;i<a[nd].sz;i++)
		if(!viz[a[nd][i]])
			dfs1(a[nd][i]);
}

int multime(int i)
{
	if(t[i]!=i) t[i]=multime(t[i]);
	return t[i];
}

int uneste(int i, int j)
{
	i=multime(i);
	j=multime(j);
	if(i==j) return 0;
	if(rang[i]<rang[j]) t[i]=j;
	else t[j]=i;
	if(rang[i]==rang[j]) rang[i]++;
	return 1;
}


void calcul()
{
	int i;
	for(i=1;i<=n;i++) t[i]=i;
	for(i=1;i<=n;i++) if(!viz[i]) { k++; T=i; dfs1(i);}
	
	sort(E+1, E+p+1);
	int sum=0;
	int nrsol=0;
	for(i=1;i<=p;i++)
		if(uneste(E[i].x, E[i].y))
		{
			sum+=E[i].w;
			nrsol++;
			vz[i]=1;
		}
		
	freopen("flood.out", "w", stdout);
	printf("%d\n", nrsol);
	printf("%d\n", sum);
	for(i=1;i<=p;i++) if(vz[i]) printf("%d %d %d\n", E[i].x, E[i].y, E[i].w);

	
//	for(i=1;i<=n;i++) printf("%d ", t[i]);
	//printf("\n");
}


int main()
{
	citire();
	calcul();
	return 0;
}