Cod sursa(job #543890)

Utilizator darrenRares Buhai darren Data 28 februarie 2011 18:23:45
Problema Lazy Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

struct road
{
    int ind, A, B;
    long long C1, C2;
};

bool compare(const road& R1, const road& R2)
{
    if (R1.C1 != R2.C1)
        return R1.C1 < R2.C1;
    return R1.C2 > R2.C2;
}

int D[200002], T[200002];
int Find(int nod)
{
    if (nod != T[nod]) T[nod] = Find(T[nod]);
    return T[nod];
}
void Union(int nod1, int nod2)
{
    if (D[nod1] > D[nod2])
        T[nod2] = nod1;
    else
    {
        T[nod1] = nod2;
        if (D[nod1] == D[nod2]) ++D[nod2];
    }
}

int N, M;
vector<road> V;
bool S[200002];

int main()
{
    ifstream fin("lazy.in");
    ofstream fout("lazy.out");

    fin >> N >> M;
    for (int i = 1; i <= M; ++i)
    {
        road R;
        fin >> R.A >> R.B >> R.C1 >> R.C2;
        R.ind = i;

        V.push_back(R);
    }

    for (int i = 1; i <= N; ++i)
        T[i] = i;

    sort(V.begin(), V.end(), compare);
    for (vector<road>::iterator it = V.begin(); it != V.end(); ++it)
        if (Find(it->A) != Find(it->B))
        {
            Union(Find(it->A), Find(it->B));
            fout << it->ind << '\n';
        }

    fin.close();
    fout.close();
}