Cod sursa(job #2861548)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 4 martie 2022 09:22:04
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
#define INF 2000000001
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
int cost[200011],coord[200011],arb[200011],n;
void insus(int k)
{
    if(k==1)
        return;
    if(cost[arb[k]]<cost[arb[k/2]])
    {
        swap(coord[arb[k]],coord[arb[k/2]]);
        swap(arb[k],arb[k/2]);
        insus(k/2);
    }
}
void injos(int k)
{
    int x=k*2;
    if(x>n)
        return;
    if(x+1<=n && cost[arb[x+1]]<cost[arb[x]])
        x++;
    if(cost[arb[k]]>cost[arb[x]])
    {
        swap(coord[arb[k]],coord[arb[x]]);
        swap(arb[k],arb[x]);
        injos(x);
    }
}
vector <pair<int,int>> v[200011];
int m,x,y,z,i,k,S,muc[200011],N;
int main()
{
    f>>n>>m;
    N=n;
    for(i=2;i<=n;i++)
    {
        cost[i]=INF;
        coord[i]=arb[i]=i;
    }
    arb[1]=coord[1]=1;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));
    }
    while(n)
    {
        k=arb[1];
        coord[arb[1]]=1;
        arb[1]=arb[n];
        n--;
        injos(1);
        S=S+cost[k];
        for(i=0;i<v[k].size();i++)
        {
            if(cost[v[k][i].first]>v[k][i].second)
            {
                cost[v[k][i].first]=v[k][i].second;
                muc[v[k][i].first]=k;
                insus(coord[v[k][i].first]);
            }
        }
    }
    g<<S<<'\n'<<N-1<<'\n';
    for(i=2;i<=N;i++)
        g<<i<<" "<<muc[i]<<'\n';
    return 0;
}