Cod sursa(job #2569960)

Utilizator mirceatlxhaha haha mirceatlx Data 4 martie 2020 14:27:27
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb

#include <fstream>
#include <vector>
#include <algorithm>
#define MaxNumberOfNodes 200005
using namespace std;

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

int N, M, ds[MaxNumberOfNodes], minCost;
pair < int , pair < int , int > > Edges[MaxNumberOfNodes * 2];
vector < pair < int , int > > Answer;

int Root(int X)
{
    while(ds[X] != X)
    {
        ds[X] = ds[ds[X]];
        X = ds[X];
    }
    return X;
}

void UnionFind(int X, int Y)
{
    //int rootX = Root(X), rootY = Root(Y);
    ds[X] = ds[Y];
}

int Kruskal()
{
    int nodeX, nodeY, costRoad, rootX, rootY;
    for(int i = 1; i <= M; i++){
        nodeX = Edges[i].second.first;
        nodeY = Edges[i].second.second;
        costRoad = Edges[i].first;
        rootX = Root(nodeX);
        rootY = Root(nodeY);
        if(rootX != rootY){
            UnionFind(rootX,rootY);
            Answer.push_back(make_pair(nodeX,nodeY));
            minCost += costRoad;
        }
        
    }
    return minCost;
}

int main()
{
    int nodeX, nodeY, costRoad;
    cin >> N >> M;
    for(int i = 1; i <= M; i++){
        cin >> nodeX >> nodeY >> costRoad;
        Edges[i] = make_pair(costRoad,make_pair(nodeX,nodeY));
    }
    sort(Edges + 1,Edges + M + 1);
    for(int i = 1; i <= N; i++){
        ds[i] = i;
    }
    cout << Kruskal() << "\n" << Answer.size() << "\n";
    for(int i = 0; i < Answer.size(); i++){
        cout << Answer[i].first << " " << Answer[i].second << "\n";
    }
    return 0;
}