Cod sursa(job #733493)

Utilizator lucian666Vasilut Lucian lucian666 Data 12 aprilie 2012 12:39:37
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb

#include<fstream>
#include<algorithm>
#define NN 400001
using namespace std;
ofstream out("apm.out");
struct punct{
	int x,y,c;
};
punct v[NN];

int poz[NN],s,n,m,uz[NN/2],nrc;
void kruskal();
void read();
void afis();
bool cmp(punct a,punct b)
{
	if(a.c<b.c)
		return true;
	return false;
}

int main()
{
	read();
	sort(v+1,v+m+1,cmp);
	kruskal();
	afis();
	return 0;
}

void read()
{
	ifstream in("apm.in");
	in>>n>>m;
	int i,j,c;
	for(int z=1;z<=m;z++)
	{
		in>>i>>j>>c;
		v[z].x=i;
		v[z].y=j;
		v[z].c=c;
	}
}

void kruskal()
{
	for(int i=1;i<=n;i++)
		uz[i]=i;
	for(int i=1;i<=m;i++)
		if(uz[v[i].x]!=uz[v[i].y])
		{
			++nrc;
			poz[nrc]=i;
			s+=v[i].c;
			int aa=max(uz[v[i].x],uz[v[i].y]);
			int bb=min(uz[v[i].x],uz[v[i].y]);
			for(int j=1;j<=n;j++)
				if(uz[j]==bb)
					uz[j]=aa;
		}
}

void afis()
{
	out<<s<<'\n';
	out<<nrc<<'\n';
	for(int i=1;i<=nrc;i++)
		out<<v[poz[i]].x<<" "<<v[poz[i]].y<<" "<<'\n';
}