Cod sursa(job #544979)

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

#define maxSize 200002

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 root(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;

        // profitul este direct
        // proportional cu lungimea muchiei
        //edge[i].profit *= edge[i].length;

        Link[i] = i;
    }

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

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

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

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

            //if(++usedEdges == nodes - 1)
              //  break;
        }

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

    return (0);
}

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);
}

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