Cod sursa(job #580897)

Utilizator rendorzegAndrei Pavel rendorzeg Data 13 aprilie 2011 17:00:06
Problema Arbore partial de cost minim Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
struct muchii
{
	int a,b,c;
} m[170000];
struct muchii2
{
	long a1,b1;
} A[60000];
int p[170000],h[170000],C,k,mu,n;
int compare(const void *x,const void *y)
{
	return ((*(muchii*)x).c-(*(muchii*)y).c);
}
void makeset(int u)
{
	p[u]=0;
	h[u]=0;
}
int findset(int u)
{
	if (p[u]==0)
		return u;
	p[u]=findset(p[u]);
	return p[u];
}
void union1(int u, int v)
{
	u=findset(u);
	v=findset(v);
	if (h[u]>h[v])
		p[v]=u;
	else 
	{
		p[u]=v;
		if (h[u]==h[v])
			h[v]++;
	}
}
void sort()
{
	int i,j;
	muchii aux;
	for (i=0;i<mu-1;i++)
		for (j=i+1;j<mu;j++)
			if (m[i].c>m[j].c) 
			{
				aux=m[i];
				m[i]=m[j];
				m[j]=aux;
			}
}
void quicksort(muchii m[], long left, long right)
{
	int i = left, j = right;
    muchii tmp;
    int pivot;
	srand(time(NULL));
	int p;
	p=rand()%(j-i)+i;
	pivot=m[p].c;
    /* partition */
    while (i <= j) 
	{
		while (m[i].c < pivot)
            i++;
		while (m[j].c > pivot)
            j--;
		if (i <= j) 
		{
			tmp = m[i];
            m[i] = m[j];
            m[j] = tmp;
            i++;
            j--;
        }
    };
    /* recursion */
    if (left < j)
		quicksort(m, left, j);
	if (i < right)
        quicksort(m, i, right);
}
void kruskal()
{
	int i;
	k=0;
	C=0;
	/*for(i=0;i<n;i++)
		makeset(i);*/
	//quicksort(m,0,mu-1);
	qsort(m,mu,sizeof(muchii),compare);
	for (i=0; i<mu;i++)
	{
		if (findset(m[i].a)!=findset(m[i].b))
		{
			A[k].a1=m[i].a;
			A[k].b1=m[i].b;
			k++;
			C=C+m[i].c;
			union1(m[i].a,m[i].b);
			if (k==mu-1)
				break;
		}
	}
}
int main()
{
	int i;
	fin>>n>>mu;
	for (i=0;i<mu;i++)
		fin>>m[i].a>>m[i].b>>m[i].c;
	kruskal();
	fout<<C<<endl<<k<<endl;
	for (i=0;i<k;i++)
		fout<<A[i].a1<<" "<<A[i].b1<<endl;
	return 0;
}