Cod sursa(job #1324331)

Utilizator 0051David Sera 0051 Data 22 ianuarie 2015 09:45:17
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream fin("apm.in");
ofstream fout("apm.out");

#define MAX 200005

vector < pair < int , int > >v[MAX];
vector < pair < int , int > > :: iterator it;
priority_queue < pair < int , int > > pq;
int viz[MAX],b[MAX],x[MAX],n,m,s,h;

void apm()
{
    pq.push(make_pair(0,1));
    while(!pq.empty())
    {
        int nod=pq.top().second;
        int cost=pq.top().first;
        pq.pop();
        if(viz[nod])
            continue;
        bool ok=1;
        viz[nod]=1;
        s-=cost;
        for(it=v[nod].begin();it!=v[nod].end();it++)
        {
            int anod=it->first;
            int c=it->second;
            if(!viz[anod])
                pq.push(make_pair(-c,anod));
            else if(ok && c==-cost)
            {
                ok=0;
                b[++h]=anod;
                x[h]=nod;
            }
        }
    }
    fout<<s<<"\n"<<h<<"\n";
    for(int i=1;i<=h;i++)
        fout<<b[i]<<" "<<x[i]<<"\n";
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        fin>>x>>y>>z;
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));
    }
    apm();
    fin.close();
    fout.close();
    return 0;
}