Cod sursa(job #2131058)

Utilizator mateiuMateiu Ioan mateiu Data 14 februarie 2018 12:03:01
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <algorithm>
using namespace std;
struct el{
    int xl,yl,cost;
    bool es;
}v[400002];
int n,m;
int t[200002],ra[200002];
bool cp(el m1,el m2)
{
    return m1.cost<m2.cost;
}
int ver(int x)
{
  if(t[x]==x)
    return x;
  t[x]=ver(t[x]);
  return t[x];
}
int tot=0,co=0;
ifstream f("apm.in");
ofstream g("apm.out");
void reuneste(int m1,int m2)
{
    if(ra[m1]>ra[m2])
    {
        t[m1]=m2;
    }
    else
    {
        t[m2]=m1;
        if(ra[m1]==ra[m2])
            ra[m1]++;
    }
}
void krusckal()
{
    for(int i=1;i<=m;i++)
    {
        if(ver(v[i].xl)==ver(v[i].yl))
        {
            v[i].es=false;
        }
        else
        {
            reuneste(v[i].xl,v[i].yl);
            tot=tot+v[i].cost;
            co++;
        }
    }
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        f>>v[i].xl>>v[i].yl>>v[i].cost;
        v[i].es=true;
    }
    sort(v+1,v+m+1,cp);
    for(int i=1;i<=n;i++)
    {
        t[i]=i;
    }
   /* for(int i=1;i<=m;i++)
    {
        if(ver(v[i].xl)==ver(v[i].yl))
            v[i].es=false;
        else
        {
            reuneste(v[i].xl,v[i].yl);
            tot=tot+v[i].cost;
            co++;
        }

    }*/
    krusckal();
    g<<tot<<"\n";
    g<<co<<"\n";
    for(int i=1;i<=m;i++)
    {
        if(v[i].es)
        {
            g<<v[i].xl<<" "<<v[i].yl<<"\n";
        }
    }
    return 0;
}