Cod sursa(job #2311143)

Utilizator RaresIonitaUvtFMIRares Ionita UVT FMI RaresIonitaUvtFMI Data 2 ianuarie 2019 18:02:00
Problema Arbore partial de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int n,m,aux[100005],costmin,k;
struct muchie
{
    int x,y,cost;
    bool operator <(const muchie& M) const{
        return cost < M.cost;
    }
    bool verif;

}v[100005];

void read()
{
    fin>>n>>m;
    int i;
    for(i=1;i<=m;i++)
    {
        fin>>v[i].x>>v[i].y>>v[i].cost; //citire muchie si costul sau
    }
}

int FindRoot(int a)
{
    int root,b;
    root = a;
    while(aux[root] != 0)
    {
        root = aux[root];
    }
    while(a != root)
    {
        b = aux[a];
        aux[a] = root;
        a = b;
    }
    return root;
}

void Union(int a,int b)
{
    aux[b] = a;
}

void Solve()
{
    int x,y,i,nrc,nr;
    costmin = 0;
    nr=0;
    nrc=n;
    sort(v+1,v+m+1);
    for(i=1;i<=m && nrc>1;i++)
    {
        x = v[i].x;
        y = v[i].y;
        x = FindRoot(x);
        y = FindRoot(y);
        if(x!=y)
        {
            Union(x,y);
            nrc--;
            costmin += v[i].cost;
            v[i].verif = true;
        }
    }
    fout<<costmin<<'\n';
    for(i=1;i<=m;i++)
    {
        if(v[i].verif == true)
        {
            nr++;
        }
    }
    fout<<nr<<'\n';
    for(i=1;i<=m;i++)
    {
        if(v[i].verif == true)
        {
            fout<<v[i].x<<" "<<v[i].y<<'\n';
        }
    }
}

int main()
{
    read();
    Solve();
    return 0;
}