Cod sursa(job #1674828)

Utilizator alex.vasiuVasiu Alexandru alex.vasiu Data 4 aprilie 2016 21:25:41
Problema Arbore partial de cost minim Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 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;
bool comp(pair<int,int> x, pair<int,int> y)
{
    return x.second>y.second;
}
void prim()
{
    vector <int> mark(n+1,0);
    vector <int> edge(n+1,-1);
    set<pair<int,pair<int,int>>> s;
    s.insert({0,{0,1}});
    int total=0;
    for(int i=1;i<=n;i++)
        sort(begin(G[i]),end(G[i]),comp);
    while(!s.empty())
    {
        int a = s.begin()->second.second;
        int b = s.begin()->second.first;
        int cost = s.begin()->first;
        s.erase(s.begin());
        if(!mark[a])
        {
            total += cost;
            edge[a] = b;
            mark[a] = 1;
            for(auto u : G[a])
                if(!mark[u.first])
            {
                s.insert({u.second,{a,u.first}});
               // break;
            }
        }
    }
    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));
    }
    f.close();
    prim();
    g.close();
}