Cod sursa(job #689536)

Utilizator Oancea.CatalinOancea Catalin Oancea.Catalin Data 24 februarie 2012 17:09:14
Problema A+B Scor 0
Compilator cpp Status done
Runda teme_upb Marime 1.85 kb
#include<fstream>
#include<iostream>
using namespace std;
#define IN "flood.in"
#define OUT "flood.out"
#define MaxN 1001
#define inf 10000
FILE *f, *g;
int coada[MaxN], viz[MaxN], i, j, n, bune, x, y, cnt, cost, proaste, Cost;
int p, q, k, minim, ceva1, ceva2;
bool a[MaxN][MaxN], viz2[MaxN];
struct{
	int c; //cost
	int x, y; //noduri unite
}C[MaxN][MaxN], v[MaxN];
void BFS(int start)
{
	int p, u, i;
	
	p=u=i=1;
	coada[1]=start;
	viz[start]=cnt;
	while(p<=u)
	{
		for(i=1; i<=n; i++)
		{
			if(a[coada[p]][i]==1 && viz[i]==0)
			{
				viz[i]=cnt;
				u++;
				coada[u]=i;
			}
		}
		p++;
	}
}
int main()
{
	f=fopen(IN, "r");
	g=fopen(OUT, "w");
	
	fscanf(f, "%d %d", &n, &bune);
	for(i=1; i<=bune; i++)
	{
		fscanf(f, "%d %d", &x, &y);
		a[x][y]=a[y][x]=1;
	}
	for(i=1; i<=n; i++)
	{
		if(viz[i]==0)
		{
			cnt++;
			BFS(i);
		}
	}
	fprintf(g, "%d\n", cnt-1);
	fscanf(f, "%d", &proaste);
	Cost=0;

	for(i=1; i<=cnt; i++)
	{
		for(j=1; j<=cnt; j++)
			C[i][j].c=inf;
		C[i][i].c=0;
	}
	for(i=1; i<=proaste; i++)
	{
		fscanf(f, "%d %d %d", &x, &y, &cost);
		if(viz[x]!=viz[y])
		{
			if(cost<=C[viz[x]][viz[y]].c)
			{
				C[viz[x]][viz[y]].c=cost;
				C[viz[y]][viz[x]].c=cost;
				C[viz[x]][viz[y]].x=x;
				C[viz[y]][viz[x]].x=x;
				C[viz[x]][viz[y]].y=y;
				C[viz[y]][viz[x]].y=y;
			}
		}
	}

	for(k=1; k<=cnt-1; k++)
	{
		minim=inf;
		for(i=1; i<=cnt-1; i++)
		{
			for(j=i+1; j<=cnt; j++)
			{
				if(C[i][j].c<minim && (viz2[i]+viz2[j]<=1))
				{
					minim=C[i][j].c;
					p=i; q=j;
					ceva1=C[i][j].x;
					ceva2=C[i][j].y;
				}
			}
		}
		if(minim!=inf)
		{
			viz2[p]=1;
			viz2[q]=1;
			Cost+=minim;
			v[k].x=ceva1; v[k].y=ceva2; v[k].c=minim;
		}
	}

	fprintf(g, "%d\n", Cost);
	for(i=1; i<=cnt-1; i++)
		fprintf(g, "%d %d %d\n", v[i].x, v[i].y, v[i].c);
	
}