Cod sursa(job #544244)

Utilizator victor.ionescuIonescu Victor Cristian victor.ionescu Data 1 martie 2011 11:58:37
Problema Lazy Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
#define MAXM 200010
using namespace std;
int N,M;
struct muchie{

	int A,B;
	long long C1,C2;
	double logsum;
	int cat;
} V[MAXM];
int P[MAXM];
int W[MAXM];

int finsol[MAXM];


int find_set(int X){

	int dad=X;
	while (dad!=P[dad])
		dad=P[dad];

	P[X]=dad;

	return dad;
}

void unifica(int X,int Y){
	if (W[X]<W[Y]) P[X]=Y; else
		if (W[X]>W[Y]) P[Y]=X; else{

			P[X]=Y;
			++W[Y];
		}
}




inline bool cmp(const muchie &A, const muchie &B){

	if (A.C1!=B.C1)
	return (A.C1<B.C1); else return (A.C2>B.C2);
}




int main(){

	freopen("lazy.in","r",stdin);
	freopen("lazy.out","w",stdout);

	int N,M;

	scanf("%d%d",&N,&M);

	for (int i=1;i<=M;++i){

		scanf("%d%d%lld%lld",&V[i].A,&V[i].B,&V[i].C1,&V[i].C2);
		V[i].logsum=log10(V[i].C1)+log10(V[i].C2);
		V[i].cat=i;
	}

	sort(V+1,V+M+1,cmp);

	for (int i=1;i<=N;++i) { P[i]=i; W[i]=0; }


	memset(finsol,0,sizeof(finsol));

	for (int i=1;i<=M;++i){

		int X=find_set(V[i].A);
		int Y=find_set(V[i].B);

		if (X!=Y){
			unifica(X,Y);
			finsol[V[i].cat]=1;
		}
	}

	for (int i=1;i<=M;++i)
		if (finsol[i])
			printf("%d\n",i);


	fclose(stdin);
	fclose(stdout);

	return 0;
}