Cod sursa(job #2088692)

Utilizator alex99Chelba Alexandru alex99 Data 15 decembrie 2017 18:31:54
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
class prim
{
    int n,m,x,y,c;
    vector<int> t;
    pair<int, pair<int, int> > *M;
public:
    prim(int n, int m);
    void adaugare(int pas, int x, int y, int c);
    int compr(int v);
    void ArbPartDeCostMinim();
};
prim::prim(int n, int m)
{
    this->n=n;
    this->m=m;
    M = new pair<int, pair<int, int> > [m+1];
}
void prim::adaugare(int pas, int x, int y, int c)
{
    M[pas]={c,{x,y}};
}
int prim::compr(int v)
{
    if(t[v]==v)
        return v;
    t[v]=prim::compr(t[v]);
    return t[v];
}
void prim::ArbPartDeCostMinim()
{
    vector<pair<int, int> > sol;
    sort(M+1,M+m+1);
    for(int i=0;i<=n;i++)
        t.push_back(i);
    int i=1;
    int j=n-1;
    int cost=0;
    while(j)
    {
        int a=M[i].second.first;
        int b=M[i].second.second;
        int x=compr(a);
        int y=compr(b);
        if(x!=y)
        {
            t[x]=y;
            cost+=M[i].first;
            sol.push_back({a,b});
            j--;
        }
        i++;
    }
    g<<cost<<'\n'<<n-1<<'\n';
    for(auto it:sol)
        g<<it.first<<" "<<it.second<<'\n';

}
int main()
{
    int n,m,x,y,c;
    f>>n>>m;
    prim grf(n,m);
    for(int i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        grf.adaugare(i,x,y,c);
    }
    grf.ArbPartDeCostMinim();
    return 0;
}