Cod sursa(job #3251268)

Utilizator Laura139Anghel Laura Laura139 Data 25 octombrie 2024 16:06:56
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream cin("apm.in");
ofstream cout("apm.out");

struct drum
{
    int a,b,cost;
}v[400005];

bool cmp(drum a, drum b)
{
    return (a.cost<b.cost);
}

int tata[200005];
int sol[400005];

int sef(int x)
{
    if(tata[x]==x)
        return x;
    else
        return tata[x]=sef(tata[x]);
}

void unire(int n1, int n2)
{
    int s1, s2;
    s1=sef(n1);
    s2=sef(n2);
    tata[s1]=tata[s2];
}

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        v[i].a=a;
        v[i].b=b;
        v[i].cost=c;
    }
    sort(v+1, v+m+1, cmp);

    for(int i=1;i<=n;i++)
        tata[i]=i;

    int nrsol=0, pret=0;
    for(int i=1;i<=m;i++)
    {
        int n1, n2;
        n1=v[i].a;
        n2=v[i].b;

        int s1,s2;
        s1=sef(n1);
        s2=sef(n2);

        if(s1!=s2)
        {
            unire(n1, n2);
            sol[++nrsol]=i;
            pret+=v[i].cost;
        }
    }

    cout<<pret<<'\n';
    cout<<nrsol<<'\n';
    for(int i=1;i<=nrsol;i++)
    {
        cout<<v[sol[i]].a<<" "<<v[sol[i]].b<<'\n';
    }
    return 0;
}