Cod sursa(job #2338040)

Utilizator BotzkiBotzki Botzki Data 6 februarie 2019 22:08:12
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int NMAX=200000;
const int MMAX=400000;
struct muchie
{
    int u, v, cost;
    bool ok;
    //daca ok==1 atunci am folosit muchia la construirea arborelui
};
bool cmp(muchie a, muchie b)
{
    return a.cost<b.cost;
}
vector <muchie>graf;
int t[NMAX+5], h[NMAX+5];
int FindSet(int x)
{
    while(x!=t[x])
        x=t[x];
    return x;
}
void UnionSet(int x, int y)
{
    //x si y sunt radacinile celor 2 arbori
    if(h[x]==h[y])
    {
        h[x]++;
        t[y]=x;
    }
    else
    {
        if(h[x]>h[y])
            t[y]=x;
        else
            t[x]=y;
    }
}
int main()
{
    int suma=0, i, n, m, x, y, c, tu, tv, nrm=0;
    muchie a;
    a.ok=0;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        t[i]=i;
        h[i]=1;
    }
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        a.u=x;
        a.v=y;
        a.cost=c;
        graf.push_back(a);
    }
    sort(graf.begin(), graf.end(), cmp);
    for(i=0;i<m;i++)
    {

       tu=FindSet(graf[i].u);
       tv=FindSet(graf[i].v);
       if(tu!=tv)
       {
           UnionSet(tu, tv);
           suma=suma+graf[i].cost;
           nrm++;
           graf[i].ok=1;
       }
    }
    fout<<suma<<"\n";
    fout<<nrm<<"\n";
    for(i=0;i<m;i++)
        if(graf[i].ok==1)
           fout<<graf[i].u<<" "<<graf[i].v<<"\n";
    return 0;
}