Cod sursa(job #1917296)

Utilizator EpictetStamatin Cristian Epictet Data 9 martie 2017 11:53:52
Problema Lazy Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

fstream fin ("lazy.in", ios::in), fout ("lazy.out", ios::out);

class Edge { public : int x, y, c1, c2, id; } Muk[200010];
class cmp
{   public :
        bool operator () (const Edge &a, const Edge &b)
        {
            if (a.c1 < b.c1) return true;
            else if (a.c1 == b.c1 && a.c1 * a.c2 > b.c1 * b.c2) return true;
            return false;
        }
};
int n, m, T[200010], R[200010];
vector < int > Sol;

int Find(int node)
{
    int aux, boss = node;
    while (T[boss] != boss) boss = T[boss];
    while (T[node] != node)
    {
        aux = T[node];
        T[node] = boss;
        node = aux;
    }
    return boss;
}

void Unite(int boss1, int boss2)
{
    if (R[boss1] < R[boss2])
    {
        R[boss2] += R[boss1];
        T[boss1] = boss2;
    }
    else
    {
        R[boss1] += R[boss2];
        T[boss2] = boss1;
    }
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= m; i ++)
    {
        fin >> Muk[i].x >> Muk[i].y >> Muk[i].c1 >> Muk[i].c2;
        Muk[i].id = i;
    }
    sort(Muk + 1, Muk + 1 + m, cmp());
    for (int i = 1; i <= n; i ++)
    {
        R[i] = 1;
        T[i] = i;
    }
    for (int i = 1; i <= m; i ++)
    {
        int b1 = Find(Muk[i].x);
        int b2 = Find(Muk[i].y);
        if (b1 != b2)
        {
            Unite(b1, b2);
            Sol.push_back(Muk[i].id);
        }
    }
    for (auto it : Sol) fout << it << '\n';
    return 0;
}