Cod sursa(job #541448)

Utilizator galacticaBattlestar galactica Data 25 februarie 2011 11:28:23
Problema Lazy Scor 10
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 1 kb
#include<cstdio>
#include<algorithm>
using namespace std;
struct muchie{
	int a,b,ind;
	long long v,p;
}muc[100100];
struct cmp{
	bool operator() (const muchie &a,const muchie &b){
		if(a.v<b.v)
			return true;
		if(a.v>b.v)
			return false;
		if(a.p<b.p)
			return false;
		return true;
	}
};
int N,M,par[100100],sol[100100];
int tata(int x){
	if(par[x]==x)
		return x;
	return par[x]=tata(par[x]);
}
void solve(){
	int i,x,y;
	for(i=1;sol[0]<N-1;++i){
		x=tata(muc[i].a);
		y=tata(muc[i].b);
		if(x==y)
			continue;
		par[x]=y;
		sol[++sol[0]]=muc[i].ind;
	}
}
int main(){
	freopen("lazy.in","r",stdin);
	freopen("lazy.out","w",stdout);
	int i;
	scanf("%d%d",&N,&M);
	for(i=1;i<=M;++i){
		scanf("%d%d%lld%lld",&muc[i].a,&muc[i].b,&muc[i].v,&muc[i].p);
		muc[i].p-=muc[i].p*muc[i].v;
		muc[i].ind=i;
	}
	for(i=1;i<=N;++i)
		par[i]=i;
	sort(muc+1,muc+N+1,cmp());
	solve();
	for(i=1;i<=sol[0];++i)
		printf("%d\n",sol[i]);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}