Cod sursa(job #970262)

Utilizator hiticas_abelhiticasabel hiticas_abel Data 6 iulie 2013 14:24:20
Problema Lazy Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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{
    int 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());

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

    return 0;
}