Cod sursa(job #644025)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 5 decembrie 2011 03:25:14
Problema Lazy Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define file_in "lazy.in"
#define file_out "lazy.out"


#define nmax 201001

int N,M,i;
int x[nmax];
int y[nmax];
long long c[nmax];
long long p[nmax];
int sol[nmax];
int nr=0;
int c1,c2,t1,t2;
int tata[nmax];
int ind[nmax];

int cmp(int a, int b) {
	
	if (c[a]==c[b]) 
		return (p[a]>p[b]); 
	return (c[a]<c[b]);
}

int find(int x){
	
	if (x!=tata[x])
		tata[x]=find(tata[x]);
	return tata[x];
}

void unite(int i, int j) {
	
	tata[i]=j;
}

#define D 8192
char g_buf[D];
int g_p=D-1;


inline long long get()
{

	long long x=0,neg;
	while ((g_buf[g_p]<'0' || g_buf[g_p]>'9') && g_buf[g_p]!='-')
		if (++g_p==D) fread(g_buf,1,D,stdin),g_p=0;
	neg=0;
	if(g_buf[g_p]=='-'){	neg=1;
		if(++g_p==D) fread(g_buf,1,D,stdin),g_p=0;
	}
	while (g_buf[g_p]>='0' && g_buf[g_p]<='9'){
		x=x*10+g_buf[g_p]-'0';
		if (++g_p==D) fread(g_buf,1,D,stdin),g_p=0;
	}
	if (neg) x=-x;
	return x;
}

int main(){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	//scanf("%d %d", &N, &M);
	N=get();
	M=get();
	for (i=1;i<=M;++i){
		ind[i]=i;
		tata[i]=i;
		x[i]=get();
		y[i]=get();
		c[i]=get();
		p[i]=get();
		//scanf("%d %d %lld %lld", &x[i], &y[i], &c[i], &p[i]);
	}
	
	sort(ind+1,ind+M+1,cmp);
	
	for (i=1;i<=M;++i){
		
		t1=find(x[ind[i]]);
		t2=find(y[ind[i]]);
		
		if (t1!=t2){
			unite(t1,t2);
			sol[++nr]=ind[i];
		}
	}
	
	for (i=1;i<N;++i)
		 printf("%d\n", sol[i]);
	
	return 0;
	
}