Cod sursa(job #1518500)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 5 noiembrie 2015 22:17:26
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.3 kb
#include <cstdio>
#include <vector>
#define NMAX 200023
#define LIM 100000003
#define DIM 10000
int n,m;
using namespace std;
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
     numar = 0;
     char semn='+';
     while (buff[poz] < '0' || buff[poz] > '9')
     {
          semn = buff[poz];
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     }
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     }
     if (semn == '-')
          numar = -numar;
}
struct str
{
    int nod;
    int val;
}a[NMAX];
int sol[NMAX],tt[NMAX],vis[NMAX],unde[NMAX];
int nt=1;
vector<int>adj[NMAX],cst[NMAX];
int stanga(int x)
{
    return 2*x;
}
int dreapta(int x)
{
    return 2*x+1;
}
int tata(int x)
{
    return x>>1;
}
void checkup(int pos)
{
    while(1)
    {
        int t=tata(pos);
        if(t==0) return;
        if(a[t].val>a[pos].val)
        {
            swap(a[t].nod,a[pos].nod);
            swap(a[t].val,a[pos].val);
            swap(unde[a[t].nod],unde[a[pos].nod]);
            pos=t;
        }
        else return;
    }
}
void checkdown(int pos)
{
    while(1)
    {
        int mini=a[pos].val,caz=0;
        int s=stanga(pos);
        if(s<=nt&&mini>a[s].val)
        {
            mini=a[s].val;
            caz=1;
        }
        int dr=dreapta(pos);
        if(dr<=nt&&mini>a[dr].val)
        {
            mini=a[dr].val;
            caz=2;
        }
        if(caz==0) break;
        else if(caz==1)
        {
            swap(a[s].nod,a[pos].nod);
            swap(a[s].val,a[pos].val);
            swap(unde[a[s].nod],unde[a[pos].nod]);
            pos=s;
        }
        else
        {
            swap(a[dr].nod,a[pos].nod);
            swap(a[dr].val,a[pos].val);
            swap(unde[a[dr].nod],unde[a[pos].nod]);
            pos=dr;
        }
    }
}
void rem()
{
    swap(a[1].nod,a[nt].nod);
    swap(a[1].val,a[nt].val);
    swap(unde[a[1].nod],unde[a[nt].nod]);
    nt--;
    checkdown(1);
}
int main()
{
    freopen ("apm.in","r",stdin);
    freopen ("apm.out","w",stdout);
    citeste(n),citeste(m);
    int x1,x2,cttx;
    for(int i=1;i<=m;i++)
    {
        citeste(x1),citeste(x2),citeste(cttx);
        adj[x1].push_back(x2);
        cst[x1].push_back(cttx);
        adj[x2].push_back(x1);
        cst[x2].push_back(cttx);
    }
    sol[1]=0;
    a[1].nod=1;
    a[1].val=sol[1];
    unde[1]=1;
    for(int i=2;i<=n;i++)
    {
        ++nt;
        sol[i]=LIM;
        a[i].nod=i;
        a[i].val=sol[i];
        unde[i]=nt;
    }
    vector<int>::iterator it1,it2;
    for(int i=1;i<=n;i++)
    {
        int best=a[1].nod;
        vis[best]=1;
        rem();
        for(it1=adj[best].begin(),it2=cst[best].begin();it1!=adj[best].end();++it1,++it2)
        {
            if(sol[*it1]>*it2&&vis[*it1]==0)
            {
                sol[*it1]=*it2;
                a[unde[*it1]].val=*it2;
                checkup(unde[*it1]);
                tt[*it1]=best;
            }
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++) sum+=sol[i];
    printf("%d\n%d\n",sum,n-1);
    for(int i=2;i<=n;i++) printf("%d %d\n",i,tt[i]);
}