Cod sursa(job #2173708)

Utilizator antracodsAntracod antracods Data 15 martie 2018 23:56:37
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>
#include <queue>

/// Implementare Prim

using namespace std;

const int NMAX = 200002;
const int MMAX = 400004;

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

struct edge
{
  int cost,edge1,edge2;
} v[MMAX];

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

int n,m,p=1,sum=0;
int sol1[NMAX],sol2[NMAX];
int disjoint[NMAX];

void citeste()
{
    in>>n>>m;
    for(int i=1; i<=m; i++)
    {
        disjoint[i]=i;
        int x,y,cost;
        in>>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()
{
    out<<sum<<'\n'<<p-1<<'\n';
    for(int i=1;i<p;i++)
    {
        out<<sol2[i]<<" "<<sol1[i]<<'\n';
    }
}

int main()
{
    citeste();
    rezolva();
    afis();
}