Cod sursa(job #541630)

Utilizator krateCiurdariu Dan krate Data 25 februarie 2011 12:43:54
Problema Lazy Scor 10
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 1.41 kb
#include <fstream>
#include <limits>

using namespace std;

long n,m;

typedef struct{
	long x,y,c1,c2,nro;
}muchie;

muchie a[200000];

void citire()
{
	int x,y,ca,cb,i;
	ifstream f("lazy.in");
	f>>n>>m;
	for(i=1;i<=m;i++)
	{
		f>>x>>y>>ca>>cb;
		a[i].x=x;
		a[i].y=y;
		a[i].c1=ca;
		a[i].c2=cb;
		a[i].nro=i;
	}
}
	

long partitie(muchie a[],long st,long dr)
{
	long v=a[st].c1;
	--st;
	++dr;
	while(st<dr)
	{
		do
		{
			--dr;
		}while(st<dr&&a[dr].c1>v);
		
		do
		{
			++st;
		}while(st<dr&&a[st].c1<v);
		
		if(st<dr)
		{
			muchie tmp=a[st];
			a[st]=a[dr];
			a[dr]=tmp;
		}
	}
	
	return dr;
}

void quicksort(muchie a[],int st,int dr)
{
	if(st<dr)
	{
		long p=partitie(a,st,dr);
		quicksort(a,st,p);
		quicksort(a,p+1,dr);
	}
}

void kruskal()
{
	long arb[200000];
	long apm[200000];
	int i,j,k=0;
	for(i=1;i<=n;i++)
		arb[i]=i;
	for(i=1;i<=m;i++)
	{
		if(arb[a[i].x]!=arb[a[i].y])
		{
			long aux;
			if(arb[a[i].x]<arb[a[i].y])
			{
				aux=arb[a[i].y];
				for(j=1;j<=n;j++)
				{
					if(arb[j]==aux) arb[j]=arb[a[i].x];
				}
			}
			else
			{
				aux=arb[a[i].x];
				for(j=1;j<=n;j++)
				{
					if(arb[j]==aux) arb[j]=arb[a[i].y];
				}
			}
			k++;
			apm[k]=a[i].nro;
		}
	}
	ofstream g("lazy.out");
	for(i=1;i<=k;i++)
		g<<apm[i]<<"\n";
}


int main()
{
	citire();
	quicksort(a,1,m);
	kruskal();
	return 0;
}