Cod sursa(job #1498800)

Utilizator theprdvtheprdv theprdv Data 9 octombrie 2015 10:50:47
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>

#define MAXN 200002
#define foreach(V) for(vector < pair<int, int> > :: iterator it = (V).begin(); it != (V).end(); ++it)

using namespace std;

int N, M, T[MAXN], Heap[MAXN << 1], minE[MAXN], used[MAXN], size;
vector < pair<int, int> > G[MAXN];

inline bool cmp(int x, int y){
    return minE[x] > minE[y];
}

int main(){
    freopen("data.in", "r", stdin);
    freopen("data.out", "w", stdout);

    scanf("%d %d", &N, &M);

    for(int i = 1; i <= N; ++i){
        int x, y, c;
        scanf("%d %d %d", &x, &y, &c);

        G[x].push_back(make_pair(y, c));
        G[y].push_back(make_pair(x, c));
    }

    Heap[++size] = 1;
    memset(minE, 0x7F, sizeof(minE[0]) * N);
    minE[1] = -1000;

    while(size){
        int node = Heap[1];
        pop_heap(Heap + 1, Heap + size-- + 1, cmp);
        if (used[node]) continue;
        used[node] = 1;

        foreach(G[node])
            if (!used[it->first] && minE[it->first] > it->second){
                T[it->first] = node;
                minE[it->first] = it->second;
                Heap[++size] = it->first;
                push_heap(Heap + 1, Heap + size + 1, cmp);
            }
    }

    for (int i = 2; i <= N; ++i)
        printf("%d ", T[i]);

    return 0;
}