Cod sursa(job #1306628)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 31 decembrie 2014 11:56:37
Problema Lazy Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#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*A.c2>B.c1*B.c2;
    }
    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;
}