Cod sursa(job #2600111)

Utilizator patcasrarespatcas rares danut patcasrares Data 11 aprilie 2020 23:29:55
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int DN=1e6+5;
int n,m,pr[DN];
pair<int,pair<int,int> >mc[DN];
priority_queue<pair<int,int> >pq;
vector<pair<int,int> >sol;

long long sum;

int getpr(int nod)
{
    if(pr[nod]==nod)
        return nod;
    pr[nod]=getpr(pr[nod]);
    return pr[nod];
}


void unesc(int f,int g,int cost)
{
    f=getpr(f);
    g=getpr(g);
    if(f==g)
        return;
    pr[f]=g;
    sol.push_back({f,g});
    sum+=cost;
}
int main()
{
    FILE *fin=fopen("apm.in","r");
    FILE *fout=fopen("apm.out","w");

    fscanf(fin,"%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        fscanf(fin,"%d%d%d",&mc[i].y.x,&mc[i].y.y,&mc[i].x);

    for(int i=1;i<=n;i++)
        pr[i]=i;

    sort(mc+1,mc+m+1);
    for(int pz=1;pz<=m;pz++)
    {
        int f=mc[pz].y.x;
        int g=mc[pz].y.y;
        unesc(f,g,mc[pz].x);
    }
    fprintf(fout,"%d\n",sum);
    fprintf(fout,"%d\n",(int)sol.size());
    for(auto i:sol)
        fprintf(fout,"%d %d\n",i.x,i.y);

}