Cod sursa(job #587390)

Utilizator maritimCristian Lambru maritim Data 4 mai 2011 19:31:46
Problema Lazy Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 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 %d %d",&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)
{
	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();
	sort(M+1,M+m+1,cmp);
	complet();
//	kruscal();
	return 0;
}