Cod sursa(job #5578)

Utilizator mastermageSchneider Stefan mastermage Data 13 ianuarie 2007 12:13:40
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <vector>
using namespace std;

#define maxN 10100

int n,m,p,part[maxN],log[maxN],viz[maxN],conto[maxN],add[maxN],need;
int ron;

struct nod{int a,c;};
struct nod2{int a,b,c;}hist[maxN];



void norm(){
	for(int i=0;i<n;i++)log[part[i]]=1;
	for(int i=0;i<=n;i++)if(log[i])need++;
}


int main(){
	FILE*fi=fopen("flood.in", "r"),*fo=fopen("flood.out","w"); 
	fscanf(fi,"%d %d",&n,&m);
	vector<vector<nod> > liad(n);
	
	for(int i=0;i<n;i++)part[i]=i+1;
	
	for(int i=0;i<m;i++){
		int a,b,pa,pb;fscanf(fi,"%d %d",&a,&b);a--,b--;
		if(part[a]<part[b]){int aux=a;a=b;b=aux;}
		pa=part[a],pb=part[b];
		for(int j=0;j<n;j++)if(part[j]==pa)part[j]=pb;
	}
	norm();fprintf(fo,"%d\n",need-1);fflush(fo);
	
	fscanf(fi,"%d",&p);
	for(int i=0; i<p; i++){
		int a,b,c;fscanf(fi, "%d %d %d", &a, &b, &c);a--,b--;
		nod x;x.c=c;
		x.a=a;liad[b].push_back(x);
		x.a=b;liad[a].push_back(x);
	}
	
	for(int i=1;i<need;i++){
		
		
		for(int j=0;j<n;j++)if(part[j]==1 && !viz[j]){
			viz[j]=1;
			for(int o=0; o<liad[j].size(); o++)if(part[liad[j][o].a]!=1){
				int cur=part[liad[j][o].a], pret=liad[j][o].c;
				if(pret<conto[cur] || !conto[cur]){
					conto[cur]=pret;
					hist[cur].a=j;hist[cur].b=liad[j][o].a; hist[cur].c=pret;
				}
			}
		}
		
		int min=-1, pmin;
		for(int j=0; j<=n; j++)if(conto[j] && !add[j])if(min>conto[j] || min==-1)min=conto[j], pmin=j;
		
		for(int j=0; j<n; j++)if(part[j]==pmin)part[j]=1;
		add[pmin]=1;ron+=min;
		
	}
	
	
	
	fprintf(fo, "%d\n", ron);fflush(fo);
	for(int j=0; j<=n; j++)if(add[j]){
		fprintf(fo,"%d %d %d\n", hist[j].a+1, hist[j].b+1, hist[j].c);
	}
	
	fclose(fi);fclose(fo);
	return 0;
}