Cod sursa(job #2236468)

Utilizator mirelPmirel p mirelP Data 29 august 2018 17:37:02
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#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,sel;
};
int n,m,i,j,k,total,ma,x3,y3;
Muchie vv[NMAX+5];
int t[NMAX+5],h[NMAX+5];
bool cmp(Muchie a,Muchie b)
{
    return a.cost<b.cost;
}
int FindSet(int x)
{
    while(t[x]!=x)
        x=t[x];
    return x;
}
void UnionSet(int x,int y)
{
    if(h[x]==h[y])
    {
        h[x]++;
        t[y]=x;
    }
    else
        if(h[x]<h[y])
    {
        t[x]=y;
    }
    else
        t[y]=x;
}

int main()
{
       fin>>n>>m;
       int c;
       for(i=1;i<=n;i++)
       {
           t[i]=i;
           h[i]=1;
       }
       
       for(i=1;i<=m;i++)
       {
           fin>>x3>>y3>>c;
           vv[i].u=x3;
           vv[i].v=y3;
           vv[i].cost=c;
           vv[i].sel=0;
       }
       int tu,tv;
       sort(vv+1,vv+m+1,cmp);

       for(i=1;i<=m && ma<=n-1;i++)
       {
           tu=FindSet(vv[i].u);
           tv=FindSet(vv[i].v);
           if(tu!=tv)
           {
               total+=vv[i].cost;
               vv[i].sel=1;
               ma++;
               UnionSet(tu,tv);
           }
       }
       fout<<total<<endl;
       fout<<ma<<endl;
       for(i=1;i<=m;i++)
        if(vv[i].sel==1)
        fout<<vv[i].v<<" "<<vv[i].u<<"\n";
    return 0;
}