Cod sursa(job #2174182)

Utilizator DenisPetreCsRekkles DenisPetre Data 16 martie 2018 11:07:05
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

ifstream fin("apm.in");
ofstream fout("apm.out");


struct edge{
int cost,edge1,edge2;
};

bool cmp(edge a , edge b)
{
    return a.cost<b.cost;
}

const int NLim=200002;
const int MLim=400004;
int n,m;
int disjoint[NLim],sol1[NLim],sol2[NLim],p=1,sum=0;
edge v[MLim];

void citire()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        disjoint[i]=i;
        fin>>v[i].edge1>>v[i].edge2>>v[i].cost;
    }
}

int father(int x)
{
    if(disjoint[x]==x)
        return x;
    disjoint[x]=father(disjoint[x]);
    return disjoint[x];
}

void unite(int x, int y)
{
    if(rand()%2==0)
        disjoint[father(x)]=father(y);
    else
    disjoint[father(y)]=father(x);
}

void rezolva()
{
    sort(v+1,v+m+1,cmp);

    for(int i=1;i<=m;i++)
    {
        int node1=v[i].edge1;
        int node2=v[i].edge2;
        int fnode1=father(node1);
        int fnode2=father(node2);

        if(fnode1!=fnode2)
        {
            unite(fnode1,fnode2);
            sol1[p]=node1;
            sol2[p]=node2;
            sum+=v[i].cost;
            p++;
        }
    }
}


void afis()
{
    fout<<sum<<"\n"<<p-1<<"\n";
    for(int i=1;i<p;i++)
    {
        fout<<sol2[i]<<" "<<sol1[i]<<"\n";
    }
}


int main()
{
    citire();
    rezolva();
    afis();
    return 0;
}