Cod sursa(job #1366447)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 1 martie 2015 01:58:07
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <bitset>

#define INF 0x3f3f3f3f
#define Nmax 200005

using namespace std;

vector<vector<pair<int,int> > > G;
priority_queue<pair<int, int> > Q;
vector<int> DP,tata;
bitset<Nmax> used;
int N,M;

void Read()
{
    scanf("%d%d",&N,&M);
    G.resize(N+1);
    tata.resize(N+1);
    DP.resize(N+1);
    DP.assign(N+1,INF);
    int a,b,c;
    for(int i = 1; i <= M; ++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        G[a].push_back(make_pair(c,b));
        G[b].push_back(make_pair(c,a));
    }
}

void Prim(int k)
{
    DP[k] = 0;
    Q.push(make_pair(0,k));
    int cost;
    while(!Q.empty())
    {
        k = Q.top().second;
        used[k] = 1;
        cost = -Q.top().first;
        Q.pop();
        if(DP[k] > cost)
            continue;
        for(vector<pair<int,int> >::iterator it = G[k].begin(); it != G[k].end(); ++it)
            if(!used[it->second] && DP[it->second] > it->first)
            {
                DP[it->second] = it->first;
                tata[it->second] = k;
                Q.push(make_pair(-DP[it->second],it->second));
            }
    }
    int total = 0;
    for(int i = 1; i <= N; ++i)
        total += DP[i];
    printf("%d\n%d\n",total,N-1);
    for(int i = 2; i <= N; ++i)
        printf("%d %d\n",i,tata[i]);
}

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

    Read();
    Prim(1);

    return 0;
}