Cod sursa(job #733529)

Utilizator lucian666Vasilut Lucian lucian666 Data 12 aprilie 2012 13:39:46
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 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,T[NN];
void kruskal();
void read();
void afis();
bool cmp(punct a,punct b)
{
	if(a.c<b.c)
		return true;
	return false;
}
int search (int x) {
if (x != T[x]) T[x] = search (T[x]);
return T[x];
}
void reunion (int x, int y) {
T[search (x)] = search (y);
}
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++)
		T[i]=i;
	for(int i=1;i<=m;i++)
		if(search(v[i].x)!=search(v[i].y))
		{
			++nrc;
			poz[nrc]=i;
			s+=v[i].c;
			reunion(v[i].x,v[i].y);

		}
}

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';
}