Cod sursa(job #541453)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 25 februarie 2011 11:32:48
Problema Lazy Scor 50
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 1.73 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

#define dl double long
#define NMAX 200005
#define ll long long
#define pi pair<int,int>
#define pl pair<ll,ll>
#define pii pair< int , pair < pi, pl > >
#define ind first
#define x second.first.first
#define y second.first.second
#define cost second.second.first
#define cash second.second.second

int tata[NMAX],grad[NMAX];
int n,m,nr,sol[NMAX];
pii v[NMAX];

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

inline int cmp(const pii& a,const pii& b)
{
    if(a.cost==b.cost)
    {
        dl c1=a.cost;
        dl c2=a.cash;
        dl d1=b.cost;
        dl d2=b.cash;
        dl rz1=c1/d2;
        dl rz2=d1/c2;
        
        return rz1>rz2;
    }
    return a.cost<b.cost;
}

int main ()
{
    int i,t1,t2;
    
    freopen("lazy.in","r",stdin);
    freopen("lazy.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&v[i].x,&v[i].y);
        scanf("%lld%lld",&v[i].cost,&v[i].cash);
        v[i].ind=i;
    }
    sort(v+1,v+m+1,cmp);
    for(i=1;i<=n;i++)
    {
        tata[i]=i;
        grad[i]=1;
    }
    for(i=1;i<=m;i++)
    {
        t1=find(v[i].x);
        t2=find(v[i].y);
        if(t1==t2)
            continue;
        if(grad[t1]>grad[t2])
        {
            tata[t2]=t1;
            grad[t1]+=grad[t2];
        }
        else
        {
            tata[t1]=t2;
            grad[t2]+=grad[t1];
        }
        sol[++nr]=v[i].ind;
        t1=find(1);
        if(grad[t1]==n)
            break;
    }
    for(i=1;i<=nr;i++)
        printf("%d\n",sol[i]);
    return 0;
}