Cod sursa(job #544959)

Utilizator feelshiftFeelshift feelshift Data 2 martie 2011 15:11:40
Problema Lazy Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
// http://infoarena.ro/problema/lazy
#include <fstream>
#include <algorithm>
using namespace std;

#define maxSize 200001

ifstream in("lazy.in");
ofstream out("lazy.out");

struct stuff {
    int from,to;
    long long length,profit;
};

int nodes,nrEdges;
int group[maxSize];
int Link[maxSize];
stuff edge[maxSize];

bool comp(int i,int k);
int findAndUpdate(int node);

int main() {
    in >> nodes >> nrEdges;

    for(int i=1;i<=nrEdges;i++) {
        in >> edge[i].from >> edge[i].to;
        in >> edge[i].length >> edge[i].profit;

        edge[i].profit *= edge[i].length;

        Link[i] = i;
    }

    for(int i=1;i<=nodes;i++)
        group[i] = i;

    sort(Link+1,Link+nrEdges+1,comp);

    for(int i=1;i<=nrEdges;i++)
        if(findAndUpdate(edge[Link[i]].from) != findAndUpdate(edge[Link[i]].to)) {
            group[ findAndUpdate(edge[Link[i]].from) ] = findAndUpdate(edge[Link[i]].to);

            out << Link[i] << "\n";
        }

    in.close();
    out.close();

    return (0);
}

int findAndUpdate(int node) {
    if(group[node] == node)
        return node;
    else {
        group[node] = findAndUpdate(group[node]);
        return group[node];
    }
}

bool comp(int i,int k) {
    if(edge[i].length != edge[k].length)
        return (edge[i].length < edge[k].length);
    else
        return (edge[i].profit > edge[k].profit);
}