Cod sursa(job #793737)

Utilizator visanrVisan Radu visanr Data 3 octombrie 2012 21:59:47
Problema Lazy Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <cctype>
using namespace std;

#define nmax 200010

struct data
{
    int X, Y;
    long long C, P;
}V[nmax];
int Rank[nmax], Father[nmax], ind[nmax], N, M;
char S[200];

int Find(int X)
{
    if(X != Father[X]) X = Find(Father[X]);
    return X;
}

void Merge(int X, int Y)
{
    if(Rank[X] > Rank[Y]) Father[Y] = X;
    else Father[X] = Y;
    if(Rank[X] == Rank[Y]) Rank[Y] ++;
}

bool cmp(int i, int j)
{
    if(V[i].C == V[j].C) return V[i].P > V[j].P;
    return V[i].C < V[j].C;
}

int main()
{
    freopen("lazy.in", "r", stdin);
    freopen("lazy.out", "w", stdout);
    int i, j;
    gets(S);
    for(i = 0; isdigit(S[i]); i++) N = N * 10 + S[i] - '0';
    for(++i; isdigit(S[i]); i++) M = M * 10 + S[i] - '0';
    for(i = 1; i <= M; i++)
    {
        gets(S);
        j = V[i].X = V[i].Y = V[i].C = V[i].P = 0;
        for(; isdigit(S[j]); j++) V[i].X = V[i].X * 10 + S[j] - '0';
        for(++j; isdigit(S[j]); j++) V[i].Y = V[i].Y * 10 + S[j] - '0';
        for(++j; isdigit(S[j]); j++) V[i].C = V[i].C * 10 * 1LL + S[j] - '0';
        for(++j; isdigit(S[j]); j++) V[i].P = V[i].P * 10 * 1LL + S[j] - '0';
        ind[i] = i;
    }
    sort(ind + 1, ind + M + 1, cmp);
    for(i = 1; i <= N; i++)
        Rank[i] = 1, Father[i] = i;
    for(i = 1; i <= M; i++)
    {
        if(Find(V[ind[i]].X) != Find(V[ind[i]].Y))
        {
            Merge(Find(V[ind[i]].X), Find(V[ind[i]].Y));
            printf("%i\n", ind[i]);
        }
    }
    return 0;
}