Cod sursa(job #2338629)

Utilizator oneorzeroOne or zero oneorzero Data 7 februarie 2019 17:34:56
Problema Lazy Scor 20
Compilator cpp-64 Status done
Runda prega_agm_grupa1_contest1 Marime 1.04 kb
#include <fstream>
#include <algorithm>

#define MAXM 200000

using namespace std;

ifstream fin( "lazy.in" );
ofstream fout( "lazy.out" );

struct Drum
{
	int x, y, p;
	long long c1, c2;
};

int t[MAXM+5], h[MAXM+5], s[MAXM+5];
Drum v[MAXM+5];

inline int getf( int k )
{
	while( t[k]!=k )
		k=t[k];

	return k;
}

inline int unionf( int a, int b )
{
	int ta=getf(a);
	int tb=getf(b);

	if( ta!=tb )
	{
		if( h[ta]==h[tb] )
		{
			h[ta]++;
			t[tb]=ta;
		}
		else
			if( h[ta]<h[tb] )
				t[ta]=tb;
			else
				t[tb]=ta;

		return 1;
	}

	return 0;
}

bool cmp( Drum a, Drum b )
{
	if( a.c1==a.c2 )
		return a.c1*a.c2<b.c1*b.c2;

	return a.c1<b.c1;
}

int main()
{
	int n, m;

	fin>>n>>m;

	for( int i=1;i<=m;i++ )
	{
		fin>>v[i].x>>v[i].y>>v[i].c1>>v[i].c2;

		v[i].p=i;
	}

	for( int i=1;i<=n;i++ )
		t[i]=h[i]=i;

	sort(v+1,v+m+1,cmp);

	for( int i=1;i<=m;i++ )
		if( unionf(v[i].x,v[i].y) )
			s[++s[0]]=v[i].p;

	for( int i=1;i<=s[0];i++ )
		fout<<s[i]<<"\n";

	return 0;
}