Cod sursa(job #2937585)

Utilizator Eronatedudu zzz Eronate Data 10 noiembrie 2022 17:58:13
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("apm.in");

int nrNodes, nrEdges, father[200001],sizeTree[200001],x;
vector<tuple<int,int,int>> edges,mst;
tuple<int,int,int> emptyTuple;

void createSet(int node)
{
    father[node]=node;
    sizeTree[node]=1;
}

int findRoot(int node)
{
    if(father[node]!=node)
    {
        x=findRoot(father[node]);
        father[node]=x;
        return x;
    }
    else
        return node;
}

bool unite(int node1, int node2)
{
    int father1 = findRoot(node1), father2 = findRoot(node2);

    if(father1!=father2)
    {
        if(sizeTree[father1]>sizeTree[father2])
        {
            sizeTree[father1]+=sizeTree[father2];
            father[father2]=father1;
        }
        else
        {
            sizeTree[father2]+=sizeTree[father1];
            father[father1]=father2;
        }
        return 1;
    }
    return 0;
}

bool sortCondition(tuple<int,int,int>tupleRandom1,tuple<int,int,int>tupleRandom2)
{
    return get<2>(tupleRandom1)<get<2>(tupleRandom2);
}

int main()
{
    f>>nrNodes>>nrEdges;
    int node1,node2,weight;
    tuple<int,int,int> tupleaux;

    for(int i=1;i<=nrNodes;i++)
        createSet(i);

    for(int i=1; i<=nrEdges; i++)
    {
        f>>node1>>node2>>weight;
        tupleaux = make_tuple(node1,node2,weight);
        edges.push_back(tupleaux);
    }
    sort(edges.begin(),edges.end(), sortCondition);

    for(int i=0; i<edges.size(); i++)
        if(unite(get<0>(edges[i]),get<1>(edges[i]))==1)
            mst.push_back(edges[i]);
    for(int i=0; i<mst.size();i++)
        cout<<get<0>(mst[i])<<" "<<get<1>(mst[i])<<'\n';
    return 0;
}