Cod sursa(job #2541232)

Utilizator vladadAndries Vlad Andrei vladad Data 8 februarie 2020 11:30:21
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#define fi first
#define sc second
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
vector<pair<int, int> > v[200001];
int n, m;
bool viz[200001];
set<pair<int, pair<int, int> > >s;
vector<pair<int, pair<int, int> > >ans;
int sol;
void Prim(int nod)
{
    viz[nod]=1;
    for(int i=0; i<v[nod].size(); i++)
        s.insert({v[nod][i].sc, {nod, v[nod][i].fi}});
    while(!s.empty())
    {
        int from=(*s.begin()).sc.fi;
        int to=(*s.begin()).sc.sc;
        int c=(*s.begin()).fi;
        s.erase(s.begin());
        if(!viz[to])
        {
            ans.push_back({c, {from, to}});
            viz[to]=1;
            for(int i=0; i<v[to].size(); i++)
                s.insert({v[to][i].sc, {to, v[to][i].fi}});
        }
    }
}
int main()
{
    f>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int x, y, cost;
        f>>x>>y>>cost;
        v[x].push_back({y, cost});
        v[y].push_back({x, cost});
    }
    Prim(1);
    for(int i=0; i<ans.size(); i++)
        sol+=ans[i].fi;
    g<<sol<<'\n';
    g<<ans.size()<<'\n';
    for(int i=0; i<ans.size(); i++)
        g<<ans[i].sc.fi<<' '<<ans[i].sc.sc<<'\n';
    return 0;
}
/*9 14
1 2 10
1 3 -11
2 4 11
2 5 11
5 6 13
3 4 10
4 6 12
4 7 5
3 7 4
3 8 5
8 7 5
8 9 4
9 7 3
6 7 11
*/