Cod sursa(job #3343462)

Utilizator amunnumeVlad Patrascu amunnume Data 27 februarie 2026 15:58:25
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int N=4e5+1;
struct elem
{
    int x,y,cost;
    bool operator<(const elem &e) const
    {
        return cost<e.cost;
    }
}q[N];
struct DSU
{
    int par[N],sz[N],cost[N];
    void build(int n)
    {
        for(int i=1;i<=n;++i)
        {
            cost[i]=0;
            par[i]=i;
            sz[i]=1;
        }
    }
    int find(int x)
    {
        return ((x==par[x])?x:par[x]=find(par[x]));
    }
    int unite(int x,int y,int c)
    {
        int rx=find(x);
        int ry=find(y);
        if(rx==ry) return 0;
        if(sz[rx]<sz[ry]) swap(rx,ry);
        sz[rx]+=sz[ry];
        cost[rx]+=cost[ry];
        cost[rx]+=c;
        par[ry]=rx;
        return 1;
    }
}dsu;
int n,m,i,j,x,y,c;
vector<pair<int,int>> sol;
int main()
{
    fin>>n>>m;
    dsu.build(n);
    for(i=1;i<=m;++i)
    {
        fin>>x>>y>>c;
        q[i]={x,y,c};
    }
    sort(q+1,q+m+1);
    for(i=1;i<=m;++i)
    {
        x=q[i].x;
        y=q[i].y;
        c=q[i].cost;
        int b=dsu.unite(x,y,c);
        if(b)
        {
            sol.push_back({x,y});
        }
    }
    fout<<dsu.cost[dsu.find(1)]<<'\n';
    fout<<sol.size()<<'\n';
    for(auto e:sol)
    {
        fout<<e.first<<' '<<e.second<<'\n';
    }
    return 0;
}