Cod sursa(job #1418251)

Utilizator felixiPuscasu Felix felixi Data 12 aprilie 2015 15:01:04
Problema Lazy Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

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

const int NMAX = 200000;

struct MUC {
    int x,y,c,b,i;
};

bool cmp( MUC A, MUC B ) {
    return ( A.c < B.c || ( A.c==B.c && A.b > B.b ) );
}

MUC v[NMAX+2];
int N, M, tt[NMAX+2], gr[NMAX+2];

int Root( int nod ) {
    if( tt[nod] == nod ) return nod;
    return ( tt[nod] = Root( tt[nod] ) );
}

void Union( int x, int y ) {
    int Rx = Root(x), Ry = Root(y);
    if( gr[Rx] < gr[Ry] ) {
        tt[Rx] = Ry;
        gr[Ry] += gr[Rx];
    }
    else {
        tt[Ry] = Rx;
        gr[Rx] += gr[Ry];
    }
}

int main() {
    in >> N >> M;
    for( int i = 1;  i <= N;  ++i ) { tt[i] = i;  gr[i] = 1; }
    for( int i = 1;  i <= M;  ++i ) {
        in >> v[i].x >> v[i].y >> v[i].c >> v[i].b;
        v[i].i = i;
    }
    sort( v+1, v+M+1, cmp );
    for( int i = 1;  i <= M;  ++i ) {
        if( Root( v[i].x ) != Root( v[i].y ) ) {
            out << v[i].i << '\n';
            Union( v[i].x, v[i].y );
        }
    }
    return 0;
}