Cod sursa(job #2311780)

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

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

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,costmin,nr;
    costmin = 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";
    nr=0;
    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";
        }
    }
    fout.close();
}

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