Cod sursa(job #545155)

Utilizator avram_florinavram florin constantin avram_florin Data 2 martie 2011 20:01:27
Problema Lazy Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<fstream>
#include<algorithm>
#define MaxN 200005

using namespace std;

struct muchie{
		int x,y,c1,c2,ind;
		};
muchie e[MaxN];

int n,m,T[MaxN],rg[MaxN];

struct cmp{
	bool operator()(const muchie &a , const muchie &b )
		{
			if( a.c1 != b.c1 )
				return a.c1<b.c1;
				else
				return a.c2>b.c2;
		}
};

int find_root(int x)
{
	int y,rad;
	rad = x;
	while( T[rad] != rad )
		rad = T[rad];
	while( T[x] != x )
		{
			y = T[x];
			T[x] = rad;
			x = y;
		}
	return rad;
}

void merge(int x , int y)
{
	if( rg[x] <= rg[y] )
		T[x] = y;
		else
		T[y] = x;
	if( rg[x] == rg[y] )
		++rg[y];
}

int main()
{
	ifstream f ("lazy.in");
	ofstream g ("lazy.out");
	f >> n >> m;
	int i,nr;
	for( i = 1 ; i <= n ; i++ )
		T[i] = i , rg[i] = 1;
	for( i = 1 ; i <= m ; i++ )
		{
			f >> e[i].x >> e[i].y >> e[i].c1 >> e[i].c2;
			e[i].ind = i;
		}
	sort(e+1,e+m+1,cmp());
	i = 1;
	nr = 0;
	while( nr < n-1 )
		{
			int rx,ry;
			rx = find_root(e[i].x);
			ry = find_root(e[i].y);
			if( rx != ry )
				{
					merge(rx,ry);
					nr++;
					g << e[i].ind << '\n';
				}
			i++;
		}
	return 0;
}