Pagini recente » Cod sursa (job #1505806) | Cod sursa (job #2086749) | Cod sursa (job #969448) | Cod sursa (job #2130080) | Cod sursa (job #1306626)
#include <cstdio>
#include <algorithm>
#include <cmath>
#define Nmax 200005
#define eps 0.0000000000000001
using namespace std;
int n,sol[Nmax],t[Nmax];
inline int Find(int a)
{
int rad,i=a;
while(t[a]>0)
a=t[a];
rad=a;
while(t[i]>0)
{
a=t[i];
t[i]=rad;
i=a;
}
return rad;
}
inline void Union(int a, int b)
{
if(-t[b]>-t[a]) swap(a,b);
t[a]+=t[b];
t[b]=a;
}
inline int Semn(double x)
{
if(x<eps) return -1;
return 1;
}
struct Edge
{
int x,y,poz;
double c1,c2;
};
Edge a[Nmax];
inline bool Cmp(const Edge A, const Edge B)
{
int semn1,semn2;
if(A.c1==B.c1)
{
semn1=Semn(A.c1)*Semn(A.c2);
semn2=Semn(B.c1)*Semn(B.c2);
if(semn1==-1)
{
if(semn2==1) return false;
return (log(fabs(A.c1))+log(fabs(A.c2))-log(fabs(B.c1))-log(fabs(B.c2))<eps);
}
if(semn2==-1) return true;
return (log(fabs(A.c1))+log(fabs(A.c2))-log(fabs(B.c1))-log(fabs(B.c2))>eps);
}
return A.c1<B.c1;
}
int main()
{
int i,m,x,y;
freopen ("lazy.in","r",stdin);
freopen ("lazy.out","w",stdout);
scanf("%d%d", &n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d%lf%lf", &a[i].x,&a[i].y,&a[i].c1,&a[i].c2);
a[i].poz=i;
}
sort(a+1,a+m+1,Cmp);
for(i=1;i<=n;++i) t[i]=-1;
for(i=1;i<=m;++i)
{
x=Find(a[i].x); y=Find(a[i].y);
if(x!=y)
{
sol[++sol[0]]=a[i].poz;
Union(x,y);
}
}
for(i=1;i<=sol[0];++i) printf("%d\n", sol[i]);
return 0;
}