Cod sursa(job #543670)

Utilizator vladiiIonescu Vlad vladii Data 28 februarie 2011 14:17:36
Problema Lazy Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
#define maxn 200010
#define LL long long

int N, M;
int Arb[maxn], H[maxn];
struct Muchii {
    int x, y, idx;
    LL eff, cost;
} much[maxn];

vector<int> sol;

int cmp(Muchii a, Muchii b) {
    if(a.eff != b.eff) return a.eff < b.eff;
    return a.cost > b.cost;
}

int CC(int nod) {
    while(Arb[nod] != nod) {
         nod = Arb[nod];
    }
    return nod;
}

int Unite(int p, int q) {
    if(H[p] > H[q]) {
         Arb[q] = p;
    }
    else {
         Arb[p] = q;
    }

    if(H[p] == H[q]) { H[q]++; }
}


int main() {
    FILE *f1=fopen("lazy.in", "r"), *f2=fopen("lazy.out", "w");
    int i, p, q; LL e, j;

    fscanf(f1, "%d %d\n", &N, &M);
    for(i=1; i<=M; i++) {
         fscanf(f1, "%d %d %lld %lld\n", &p, &q, &e, &j);

         much[i].idx = i;
         much[i].x = p; much[i].y = q;
         much[i].eff = e; much[i].cost = j;
    }

    for(i=1; i<=N; i++) {
         Arb[i] = i, H[i] = 1;
    }

    sort(much+1, much+M+1, cmp);

    for(i=1; i<=M; i++) {
         p = CC(much[i].x); q = CC(much[i].y);
         if(p != q) {
              Unite(p, q);
              sol.push_back( much[i].idx );
         }
    }

    for(i=0; i<sol.size(); i++) {
         fprintf(f2, "%d\n", sol[i]);
    }

    fclose(f1); fclose(f2);
    return 0;
}