Cod sursa(job #544118)

Utilizator skullLepadat Mihai-Alexandru skull Data 1 martie 2011 08:29:12
Problema Lazy Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
#define nmax 200005

int X[nmax], Y[nmax], ind[nmax], GR[nmax];
long long C1[nmax], C2[nmax];
int N, M;

int amaimiccab(int x, int y)
{
	if (C1[x] < C1[y]) return 1;
	if (C1[x] > C1[y]) return 0;
	if (C2[x] < C2[y]) return 0;
	return 1;
}

struct cmp
{
	bool operator () (const int &a, const int & b) const
	{
		return amaimiccab(a, b);//C1[a] < C1[b];
	}
};

void citire ()
{
	int i;
	scanf("%d%d", &N, &M);
	for (i = 1; i <= M; ++i) scanf("%d%d%lld%lld", &X[i], &Y[i], &C1[i], &C2[i]);
}

int grupa (int x)
{
	if (GR[x] == x) return x;
	GR[x] = grupa(GR[x]);
	return GR[x];
}

void solve ()
{
	int i, x, y;
	for (i = 1; i <= M; ++i) ind[i] = i;
	for (i = 1; i <= N; ++i) GR[i] = i;
	sort(ind+1, ind+M+1, cmp() );
	for (i = 1; i <= M; ++i)
	{
		x = X[ind[i]]; y = Y[ind[i]];
		if ( grupa(x) != grupa (y) )
		{
			GR[grupa(x)] = grupa(y);
			printf("%d\n", ind[i]);
		}
	}
}

int main ()
{
	freopen("lazy.in","r",stdin);
	freopen("lazy.out","w",stdout);
	citire ();
	solve ();
	return 0;
}