Cod sursa(job #1974621)

Utilizator dark_knight2012Potec Tiberiu dark_knight2012 Data 28 aprilie 2017 11:18:02
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <list>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

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

struct cost
{
    int x;
    int y;
    int val;
    int ok=0;
};

struct multime
{
    int parinte;
    int rank;
}*set;


bool compare(const cost &a, const cost &b)
{
    return a.val < b.val;
}

vector <cost> citire(int &n, int &m)
{
    int a,b,costul;
    in>>n>>m;
    vector <cost> Lc;
    for(int i=1; i<=m; i++)
    {
        in>>a>>b>>costul;
        cost z;
        z.x=a;
        z.y=b;
        z.val=costul;
        z.ok=0;
        Lc.push_back(z);
    }
    sort(Lc.begin(),Lc.end(),compare);
    return Lc;
}

int find(multime *set,int val)
{
    if(set[val].parinte==val) return val;
    return find(set,set[val].parinte);
}

int reuniune(multime *set,int a,int b)
{
    if(set[a].rank < set[b].rank)
        set[a].parinte=b;
    else if(set[a].rank > set[b].rank)
        set[b].parinte=a;
    else
    {
        set[b].parinte=a;
        set[a].rank++;
    }
    return 1;
}

int Kruskal(vector <cost>Lc, int n)
{
    int s=0;
    set = new multime [n+1];
    for(int i=1; i<=n; i++)
    {
        set[i].parinte=i;
        set[i].rank=0;
    }
    auto it=Lc.begin();
    int nr=0;
    int k=0;
    while(k<n-1)
    {
        int a=find(set,(*it).x);
        int b=find(set,(*it).y);
        if(a!=b)
        {
            (*it).ok=1;
            s+=((*it).val);
            nr++;
            reuniune(set,a,b);
            k++;
        }
        it++;
    }
    out<<s<<endl;
    out<<nr<<endl;
    for(auto it=Lc.begin();it!=Lc.end();it++)
    {
        if((*it).ok==1) out<<(*it).x<<" "<<(*it).y<<endl;
    }
    return 1;
}

int main()
{
    int n,m;
    vector <cost> Lc;
    Lc=citire(n,m);
    Kruskal(Lc,n);
    return 0;
}