Cod sursa(job #565724)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 28 martie 2011 11:03:30
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <stdio.h>
const long NMAX=200010;
const long MMAX=400010;

struct graf  {long x, y, c;};

graf g[MMAX];
long n, m, p[NMAX], h[NMAX], sol[MMAX], suma, nrsol;

void makeSet(int u);
int findSet(int u);
void setUnion(int u, int v);
long part(long jos, long sus);
void quicksort(long jos, long sus);

int main()
{
	long i, j, temp;
	freopen("apm.in", "r", stdin);
	freopen("apm.out", "w", stdout);
	scanf("%ld%ld", &n, &m);
	for (i=0; i<m; i++)
	  scanf("%ld%ld%ld", &g[i].x, &g[i].y, &g[i].c);  
	for (i=1; i<=n; i++)
	  makeSet(i);	  
	quicksort(0, m-1);
	for (i=0; i<m; i++)
	{
        if (findSet(g[i].x)!=findSet(g[i].y))
        {
           sol[nrsol++]=i;
	       suma+=g[i].c;           
           setUnion(g[i].x, g[i].y);
           if (nrsol==(n-1))
             break;
        }//if   
    }//for i
	printf("%ld\n%ld\n", suma, nrsol);
	for (i=0; i<nrsol; i++)
		printf("%ld %ld\n", g[sol[i]].x, g[sol[i]].y);    
	return 0;
}//main

void makeSet(int u)
{
     p[u]=0;
     h[u]=0;
}//makeSet

int findSet(int u)
{
    if(p[u]==0)
      return u;
    p[u]=findSet(p[u]);
    return p[u];
}//findSet

void setUnion(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]++;
     }//else
}//setUnion
	
long part(long jos, long sus)
{
	long p=jos, u=sus;
    graf t;
	while (p<u)
	{
		while ((g[p].c<=g[jos].c)&&(p<=u))
			p++;
		while ((g[u].c>g[jos].c)&&(p<=u))
			u--;
		if (p<u)
		{
    	t=g[p];
		  g[p]=g[u];
		  g[u]=t;
		}//if
	}//while
	t=g[jos];
	g[jos]=g[u];
	g[u]=t;
	return u;
}//part

void quicksort(long jos, long sus)
{
	long p;
	if (jos<sus)
	{
	  p=part(jos, sus);
		quicksort(jos, p-1);
		quicksort(p+1, sus);
	}//if
}//quicksort