Cod sursa(job #970265)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 6 iulie 2013 14:28:54
Problema Lazy Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>

using namespace std;

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

const int MAXN = 200005;

struct edge{
    long long x, y, c1, c2, idx;
}Edge[MAXN];
int padure[MAXN];

class comp{
    public:
    inline bool operator () (const edge a, const edge b)
    {
        return (a.c1 < b.c1) || (a.c1 == b.c1 && a.c2 > b.c2);
    }
};

inline int find(int x)
{
    if(padure[x] != x)
        padure[x] = find(padure[x]);
    return padure[x];
}
inline void unite(int x, int y)
{
    padure[x] = y;
}

int n, m;
int main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= m ;  ++ i)
    {
        cin >> Edge[i].x >> Edge[i].y >> Edge[i].c1 >> Edge[i].c2;
        Edge[i].idx = i;
    }
    for(int i = 1 ; i <= n ; ++ i)
        padure[i] = i;

    sort(Edge+1, Edge+m+1, comp());

    int k = 0;
    for(int i = 1 ; i <= m ; ++ i)
    {
        if(find(Edge[i].x) != find(Edge[i].y))
        {
            ++ k;
            unite(find(Edge[i].x), find(Edge[i].y));
            cout << Edge[i].idx << "\n";
            if(k == n - 1)
                return 0;
        }
    }
}