Cod sursa(job #1670611)

Utilizator alex.vasiuVasiu Alexandru alex.vasiu Data 31 martie 2016 21:24:44
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
vector <pair<int,int>> G[200005];
int n,m;
const int INF = 1e9;
void prim(int nod)
{
    vector <int> dist(n+1,INF);
    vector <int> edge(n+1,-1);
    set<pair<int,int>> s;
    dist[nod]=0;
    for(int i=2;i<=n;i++)
        s.insert({dist[i],i});
    s.insert({0,1});
    while(!s.empty())
    {
        int u = s.begin() ->second;
        s.erase(s.begin());
        for(auto p:G[u])
            if(dist[p.first]>p.second)
        {
            s.erase({dist[p.first],p.first});
            edge[p.first]=u;
            dist[p.first]=p.second;
            s.insert({dist[p.first],p.first});
        }
    }
    int total=0;
    for(int i=2;i<=n;i++)
        total+=dist[i];
    g<<total<<"\n"<<n-1<<"\n";
    for(int i=2;i<=n;i++)
        g<<i<<" "<<edge[i]<<"\n";

}
int main()
{
    int a,b,c;
    f>>n>>m;
    for(int i=0;i<m;i++)
    {
        f>>a>>b>>c;
        G[a].push_back(make_pair(b,c));
        G[b].push_back(make_pair(a,c));
    }
    prim(1);
}