Cod sursa(job #1435259)

Utilizator alexblackFMI - Dumitrache Alexandru alexblack Data 12 mai 2015 18:23:22
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.5 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in ("apm.in");
ofstream out("apm.out");
int const N=200005;
int const INF=1005;

int VEC[N],ANS,V[N];
vector <pair<int,int> > VECT[N],VANS;
int n,m,C[N];

struct heap
{
    int L;
    int H[2*N],POZ[N];

    void push(int poz)
    {
        while((poz * 2 <= L && V[H[poz]] > V[H[poz * 2]]) || (poz * 2 + 1 <= L && V[H[poz]] > V[H[poz * 2 + 1]]))
        {
            if (V[H[poz * 2]] < V[H[poz * 2 + 1]] || poz * 2 + 1 > L)
            {
                swap(H[poz],H[poz * 2]);
                swap(POZ[H[poz]],POZ[H[poz * 2]]);
                poz *= 2;
            }
            else
            {
                swap(H[poz],H[poz * 2 + 1]);
                swap(POZ[H[poz]],POZ[H[poz * 2 + 1]]);
                poz = poz * 2 + 1;
            }
        }
    }
    void pop(int poz)
    {
        while(poz > 1 && V[H[poz]] < V[H[poz / 2]])
        {
            swap(H[poz],H[poz / 2]);
            swap(POZ[H[poz]],POZ[H[poz / 2]]);
            poz = poz / 2;
        }
    }
    void introduce_in_heap(int nod)
    {
        H[++L] = nod;
        POZ[nod] = L;
        pop(L);
    }
    int scoate_radacina_heap()
    {
        int x = H[1];
        swap(H[1],H[L]);
        swap(POZ[H[1]],POZ[H[L]]);
        L--;
        push(1);
            POZ[x] = 0;
        return x;
    }
}h;

void introduce_in_apm(int x)
{
    for(unsigned int i = 0;i < VECT[x].size(); ++i)
    {
        int nod = VECT[x][i].first;
        int cost = VECT[x][i].second;
        V[nod] = min(V[nod],cost);
        if (V[nod] == cost) VEC[nod] = x;
    }
}

int main()
{
    in>>n>>m;
    for(int i = 1;i <= m; ++i)
    {
        int x,y,c;
        in>>x>>y>>c;
        VECT[x].push_back(make_pair(y,c));
        VECT[y].push_back(make_pair(x,c));
    }

    for(int i = 1;i <= n; ++i) V[i] = INF;
    V[1] = 0;
    introduce_in_apm(1);
    for(int i = 2;i <= n; ++i)
    {
        h.introduce_in_heap(i);
    }
    for(int i = 1;i < n; ++i)
    {
        int x = h.scoate_radacina_heap();
        introduce_in_apm(x);
        ANS += V[x];
        VANS.push_back(make_pair(x,VEC[x]));
        for(unsigned int j = 0;j < VECT[x].size(); ++j)
        {
            int nod = VECT[x][j].first;
            if (h.POZ[nod]) h.pop(h.POZ[nod]);
        }
    }
    out<<ANS<<"\n"<<n-1<<"\n";
    for(unsigned int i = 0;i < n - 1; ++i)
        out<<VANS[i].first<<" "<<VANS[i].second<<"\n";
    return 0;
}