Cod sursa(job #541433)

Utilizator S7012MYPetru Trimbitas S7012MY Data 25 februarie 2011 11:10:55
Problema Lazy Scor 70
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 0.93 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define DM 200005
using namespace std;

int n,m,
    x[DM],y[DM],ind[DM],gr[DM];
long long c1[DM],c2[DM];
vector<int> sol;

bool cmp(int i, int j) {
    if(c1[i]==c1[j]) return c2[i]*(1-c1[i])<c2[j]*(1-c1[j]);
    return c1[i]<c1[j];
}

int gaseste(int i) {
    if(gr[i]==i) return i;
    gr[i]=gaseste(gr[i]);
    return gr[i];
}

void reuniune(int i,int j) {
    gr[gaseste(i)]=gaseste(j);
}

int main()
{
    ifstream f("lazy.in");
    ofstream g("lazy.out");
    f>>n>>m;
    for(int i=1; i<=m; ++i) {
        f>>x[i]>>y[i]>>c1[i]>>c2[i];
        ind[i]=i;
    }
    for(int i=1; i<=n; ++i) gr[i]=i;
    sort(ind+1,ind+m+1,cmp);
    for(int i=1; i<=m; ++i) {
        if(gaseste(x[ind[i]])!=gaseste(y[ind[i]])) {
            reuniune(x[ind[i]],y[ind[i]]);
            sol.push_back(ind[i]);
        }
    }
    for(int i=0; i<n-1; ++i) g<<sol[i]<<'\n';
    return 0;
}