Cod sursa(job #587406)

Utilizator maritimCristian Lambru maritim Data 4 mai 2011 20:01:29
Problema Lazy Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>
#include<malloc.h>
#include<algorithm>
using namespace std;

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

xy M[200100];
int n;
int m;
int L[200101];
int grad[200101];

bool cmp(xy a,xy b){
	if (a.cost != b.cost)
		return a.cost < b.cost;
	return a.val > b.val;
}

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 %lld %lld",&M[i].x,&M[i].y,&M[i].cost,&M[i].val);
		M[i].poz = i;
	}
	
	fclose(f);
}

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)
{
	int a;
	int b;
	FILE *f = fopen("lazy.out","w");
	
	int nr = 0;
	for(int k = 1;nr<n-1 && k<=m;k++)
	{
		a = rad(M[k].x);
		b = rad(M[k].y);
		if(a != b)
		{
			fprintf(f,"%d\n",M[k].poz);
			if(grad[a]>grad[b])
				L[b] = a;
			else
				L[a] = b;
			if(grad[a] == grad[b])
				grad[b] ++;
			nr ++;
		}
	}
	
	fclose(f);
}

int main()
{
	citire();
	sort(M+1,M+m+1,cmp);
	complet();
	kruscal();
	return 0;
}