Cod sursa(job #694729)

Utilizator madalinabocaMadalina Boca madalinaboca Data 27 februarie 2012 23:07:17
Problema Arbore partial de cost minim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");

void Citire();
void QS(int st,int dr);
void Kruskal();
void unific(int x,int y);
void Afisare();
int m,n,cost,conex[200009];
int contor;
struct muchie
{
	int x;
	int y;
	int c;
};
muchie v[400009],x;

int main()
{
	Citire();
	QS(1,m);
	Kruskal();
	Afisare();
}
void Citire()
{
	int i;
	int xx,yy,cc;
	fin>>n>>m;
	for(i=1;i<=m;i++)
	{
		fin>>xx>>yy>>cc;
		v[i].x=xx;
		v[i].y=yy;
		v[i].c=cc;
	}
	for(i=1;i<=n;i++)
		conex[i]=i;
}
void QS(int st,int dr)
{
	if(st<dr)
	{
	int i,j;
	i=st;j=dr;
	muchie z;
	z=v[st];
	while(i<j)
	{
		while(i<j &&v[j].c>=z.c) j--;
		v[i]=v[j];
		while(i<j &&v[i].c<=z.c) i++;
		v[j]=v[i];
	}
	v[i]=z;
	QS(st,i-1);
	QS(i+1,dr);
	}
}
void Kruskal()
{
	int i;
	for(i=1;i<=m;i++)
		if(conex[v[i].x]!=conex[v[i].y])//nu apartin aceleasi componente conexe
			{cost+=v[i].c;v[i].c=-1;unific(conex[v[i].x],conex[v[i].y]);contor++;}
}
void unific(int x,int y)//il inlocuiesc peste tot pe x cu y
{
	int i;
	for(i=1;i<=n;i++)
		if(conex[i]==x)
			conex[i]=y;
}
void Afisare()
{
	int i;
	fout<<cost<<'\n';
	fout<<contor<<'\n';
	for(i=1;i<=m;i++)
		if(v[i].c==-1)
			fout<<v[i].x<<' '<<v[i].y<<'\n';
		
}