Cod sursa(job #1243262)

Utilizator Sanduleac_VladSanduleac Vllad Alexandru Sanduleac_Vlad Data 15 octombrie 2014 18:50:10
Problema Lazy Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

struct L {
    long a, b;
    long C1, C2;
    long i;
};

long N, M;
long p[200001], s[200001];//, e[200001], pf[200001];
long a, b, C1, C2;
vector<L> muchii;

long inline ha(long x) {
    while(p[x] != x)
        x = p[x];
    return x;
}

void unite(long x, long y, long ef, long prof, long ind) {
    x = ha(x);
    y = ha(y);
    if(x == y) {
        return;
    } else printf("%ld\n", ind);
    if(s[x] > s[y]) {
        p[y] = x;
        //e[x] += ef + e[y];
        //prof[x] += prof + pf[y];
    } else if(s[x] == s[y]) {
        p[y] = x;
        s[x]++;
        //e[x] += ef + e[y];
    } else {
        p[x] = y;
        //e[y] += ef + e[x];
    }
}

bool cmp(L a, L b) {
    if(a.C1 == b.C1)
        //if(a.C2 == b.C2)
        //    return a.i < b.i;
        /*else*/ return a.C2 < b.C2;
    else return a.C1 < b.C1;
}

int main() {
    long i, j;
    L tmp;
    freopen("lazy.in", "r", stdin);
    freopen("lazy.out", "w", stdout);
    scanf("%ld %ld", &N, &M);
    for(i = 1; i <= N; i++) {
        p[i] = i;
        s[i] = 1;
        //e[i] = pf[i] = 0;
    }
    for(i = 1; i <= M; i++) {
        scanf("%ld %ld %ld %ld", &a, &b, &C1, &C2);
        tmp.a = a;
        tmp.b = b;
        tmp.C1 = C1;
        tmp.C2 = C2;
        tmp.i = i;
        muchii.push_back(tmp);
    }
    sort(muchii.begin(), muchii.end(), cmp);
    for(i = 0; i < M; i++)
        unite(muchii[i].a, muchii[i].b, muchii[i].C1, muchii[i].C2, muchii[i].i);
    //i = ha(1);
    //printf("%ld\n%ld\n", e[i], pf[i]);
    return 0;
}