Cod sursa(job #587382)

Utilizator maritimCristian Lambru maritim Data 4 mai 2011 19:09:36
Problema Lazy Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<stdio.h>
#include<malloc.h>
using namespace std;

typedef struct 
{
	long int x;
	long int y;
	long int cost;
	long int val;
	long int poz;
} xy;

xy M[200001];
long int n;
long int m;
int L[200001];
int grad[200001];
char T[200001];
long long S;

void citire(void)
{
	FILE *f = fopen("lazy.in","r");
	
	fscanf(f,"%d %d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		fscanf(f,"%d %d %d %d",&M[i].x,&M[i].y,&M[i].cost,&M[i].val);
		M[i].poz = i;
	}
	
	fclose(f);
}

long int poz(int li,int ls)
{
	int i1 = 0;
	int j1 = -1;
	int jiaux = 0;
	xy c = M[(li+ls)/2];
	M[(li+ls)/2] = M[li];
	M[li] = c;
	while(li<ls)
	{
		if(M[li].cost>M[ls].cost || (M[li].cost == M[ls].cost && M[li].val < M[ls].val))
		{
			c = M[li];
			M[li] = M[ls];
			M[ls] = c;
			jiaux = -i1;
			i1 = - j1;
			j1 = jiaux;
		}
		li += i1;
		ls += j1;
	}
	return li;
}

void quick(int li,int ls)
{
	if(li<ls)
	{
		long int k = poz(li,ls);
		quick(li,k-1);
		quick(k+1,ls);
	}
}

void complet(void)
{
	for(int i=1;i<=m;i++)
		L[i] = i;
}

int rad(int n)
{
	if(L[n] == n)
		return n;
	return rad(L[n]);
}

void unire(int i,int j)
{
	i = rad(i);
	j = rad(j);
	if(grad[i]>grad[j])
		L[j] = i;
	else
		L[i] = j;
	if(grad[i] == grad[j])
		grad[i] ++;
}

void kruscal(void)
{
	FILE *f = fopen("lazy.out","w");
	
	int nr = 0;
	for(int k = 1;nr<n-1;k++)
		if(rad(M[k].x) != rad(M[k].y))
		{
			fprintf(f,"%d \n",M[k].poz);
			unire(M[k].x,M[k].y);
			nr ++;
		}
	
	fclose(f);
}

int main()
{
	citire();
	quick(1,m);
	complet();
//	kruscal();
	return 0;
}