Cod sursa(job #1676632)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 6 aprilie 2016 02:19:30
Problema Lazy Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>

const int DIM = 1 << 18;
using namespace std;

int Root[DIM], N, M;
struct edge{ int x, y, p; long long c1, c2; } Edge[DIM];

inline bool cmp( edge A, edge B ) {
    return ( A.c1 == B.c2 ) ? ( A.c2 > B.c2 ) : ( A.c1 < B.c1 );
}

inline int get_root( int node ) {
    return ( Root[node] < 0 ) ? node : get_root( Root[node] );
}

int main() {

    FILE *input_file  = fopen( "lazy.in" , "r" );
    FILE *output_file = fopen( "lazy.out", "w" );

    fscanf( input_file, "%d %d", &N, &M );

    for( int i = 1; i <= M; i ++ ) {
        fscanf( input_file, "%d %d", &Edge[i].x, &Edge[i].y );
        fscanf( input_file, "%lld %lld", &Edge[i].c1, &Edge[i].c2 );
        Edge[i].p = i;
    }

    sort( Edge + 1, Edge + M + 1, cmp );
    memset( Root, -1, sizeof(Root) );

    for( int i = 1; i <= M; i ++ ) {
        int value1 = get_root( Edge[i].x );
        int value2 = get_root( Edge[i].y );

        if( value1 != value2 ) {
            fprintf( output_file, "%d\n", Edge[i].p );

            if( Root[value1] < Root[value2] ) {
                Root[value1] += Root[value2];
                Root[value2] = value1;
            } else {
                Root[value2] += Root[value1];
                Root[value1] = value2;
            }
        }
    }

    return 0;
}