Cod sursa(job #806769)

Utilizator crazzytudTudor Popa crazzytud Data 3 noiembrie 2012 14:37:29
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream>
#include<vector>
#include<queue>
#define N 200001
#define INF 1002
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");

using namespace std;
struct muchie{
    int vf,cost;
};

vector <muchie> a[N];
priority_queue < pair <int,int> > minHeap;
int n,m;
int d[N];
int marcat[N];
int pred[N];
void citire()
{
    in>>n>>m;
    int x,y,c,i;
    for(i=1;i<=m;i++)
    {
        in>>x>>y>>c;
        a[x].push_back((muchie){y,c});
        a[y].push_back((muchie){x,c});
    }
}


int main()
{
    citire();
    int i,x,y,dist,cost=0;
    for(i=2;i<=n;i++)
        d[i]=INF;

    minHeap.push(make_pair(0,1));

    for(i=2;i<=n;i++)
    {
        while(marcat[minHeap.top().second])
        {
            minHeap.pop();
        }


        x=minHeap.top().second;
        cost+=minHeap.top().first;
        marcat[x]=1;
        minHeap.pop();

        for(int i=0;i<a[x].size();i++)
        {
            y=a[x][i].vf;
            dist=a[x][i].cost;

            if(dist<d[y]&& !marcat[y])
            {
                d[y]=dist;
                pred[y]=x;
                minHeap.push(make_pair(-dist,y));
            }

        }

    }
    while(marcat[minHeap.top().second])
        minHeap.pop();
    cost+=minHeap.top().first;

    out<<-cost<<"\n"<<n-1<<"\n";
    for(i=2;i<=n;i++)
        out<<i<<" "<<pred[i]<<"\n";
    return 0;

}