Cod sursa(job #2479508)

Utilizator deiubejanAndrei Bejan deiubejan Data 23 octombrie 2019 21:19:51
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;

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

#define cin fin
#define cout fout
/*
*/

const int NMAX=2e5+10;
const int MMAX=4e5+10;
const int CMAX=1e3+10;
int x, y, c, n, m, total;
struct t
{
    int nod1, nod2, cost;
};
vector<t>mu;
int compo[NMAX];
vector<int>comps[NMAX];
vector<t>mf;

bool comp(t x, t y)
{
    return x.cost<y.cost;
}

void read()
{
    cin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        cin>>x>>y>>c;
        mu.push_back({x, y, c});
    }
    sort(mu.begin(), mu.end(), comp);
}


void kruskal()
{

    for(int i=1; i<=n; i++)
    {
        compo[i]=i;
        comps[i].push_back(i);
    }
    for(auto muchie:mu)
    {
        if(compo[muchie.nod1]!=compo[muchie.nod2])
        {
            total+=muchie.cost;
            mf.push_back({muchie.nod1, muchie.nod2, 0});
            if(comps[compo[muchie.nod1]].size()<comps[compo[muchie.nod2]].size())
                swap(muchie.nod1, muchie.nod2);
            for(auto c:comps[compo[muchie.nod2]])
            {
                comps[compo[muchie.nod1]].push_back(c);
                compo[c]=compo[muchie.nod1];
            }
        }
    }
    cout<<total<<"\n";
    cout<<mf.size()<<"\n";
    for(auto mu: mf)
        cout<<mu.nod1<<" "<<mu.nod2<<"\n";
}

int main()
{
    read();
    kruskal();

    return 0;
}