Cod sursa(job #3344228)

Utilizator liadariaLia Daria Ostafi liadaria Data 1 martie 2026 18:07:27
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#define NMAX 200001
#define MMAX 400001
#define INF 1e9
#include <vector>
#include <queue>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
struct varf
    {
        int x,c;
        friend bool operator < (varf a,varf b);
    };
bool operator < (varf a,varf b)
{
    return a.c>b.c;
}
vector<varf> G[NMAX];
priority_queue<varf> H;
int n,m,costmin,start=1;
bool uz[NMAX];
int pre[NMAX],cmin[NMAX];
void prim();
int main()
{
    int i,x,y,c;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        G[x].push_back({y,c});
        G[y].push_back({x,c});
    }
    prim();
    fout<<costmin<<'\n'<<n-1<<'\n';
    for(i=2;i<=n;i++)
        fout<<i<<' '<<pre[i]<<'\n';
    return 0;
}
void prim()
{
    int i,vfmin,c,vf,cost;
    for(i=1;i<=n;i++) {cmin[i]=INF; pre[i]=start;}
    pre[start]=cmin[start]=0;
    H.push({start,0});
    while(!H.empty())
    {
        vfmin=H.top().x;
        c=H.top().c; H.pop();
        if(uz[vfmin]) continue;
        uz[vfmin]=1; costmin+=c;
        for(i=0;i<G[vfmin].size();i++)
        {
            vf=G[vfmin][i].x;
            cost=G[vfmin][i].c;
            if(!uz[vf] && cmin[vf]>cost)
            {
                cmin[vf]=cost;
                pre[vf]=vfmin;
                H.push({vf,cost});
            }
        }
    }
}