Cod sursa(job #5564)

Utilizator mastermageSchneider Stefan mastermage Data 13 ianuarie 2007 10:51:42
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;

#define maxN 10100

FILE*fo;
int n,m,p, adi[maxN][maxN], con[maxN][maxN], part[maxN], conto[maxN], add[maxN];
int need, ron;

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


void inputFunc(){
	FILE*fi=fopen("flood.in", "r");
	fscanf(fi, "%d %d", &n, &m);
	for(int i=0; i<m; i++){
		int a,b;
		fscanf(fi, "%d %d", &a, &b);a--,b--;
		adi[a][b]=adi[b][a]=1;
	}
	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--;
		con[a][b]=con[b][a]=c;
	}
	fclose(fi);
}

void outneed(){fprintf(fo, "%d\n", need-1);fflush(fo);}
void outron(){
	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, con[hist[j].a][hist[j].b]);
	}
	
}

void impart(){
	int*viz=new int[maxN];
	memset(viz, 0, sizeof*viz*maxN);
	for(int i=0; i<n; i++)if(!viz[i]){
		need++;
		queue<int> qu;
		qu.push(i);viz[i]=1;part[i]=need;
		while(!qu.empty()){
			int x=qu.front();qu.pop();viz[x]=1;
			for(int j=0; j<n; j++)if(!viz[j] && adi[i][j]){
				qu.push(j);part[j]=need;viz[j]=1;
			}
			
		}
		
	}
	
}

int main(){
	inputFunc();fo=fopen("flood.out", "w");
	impart();outneed();
	
	int*viz=new int[maxN];memset(viz, 0, sizeof*viz*maxN);
	
	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<n; o++)if(con[j][o] && part[o]!=1){
				int cur=part[o];
				if(con[j][o]<conto[cur] || !conto[cur]){
					conto[cur]=con[j][o];
					hist[cur].a=j;hist[cur].b=o;
				}
			}
		}
		
		int min=-1, pmin;
		for(int j=1; j<n; j++)if(conto[j])if(min>conto[j] || min==-1)min=conto[j], pmin=j;
		
		add[pmin]=1;for(int j=0; j<n; j++)if(part[j]==pmin)part[j]=1;
		ron+=min;
	}
	
	outron();
	fclose(fo);
	return 0;
}