Cod sursa(job #1043289)

Utilizator a96tudorAvram Tudor a96tudor Data 28 noiembrie 2013 11:48:41
Problema Arbore partial de cost minim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include<cstdio>
#include<vector>
#include<stack>
#include<utility>
#include<cstring>

#define N_MAX 200010
#define M_MAX 400010
#define v first
#define c second
#define pb push_back
#define INF 400000000
using namespace std;

vector <pair <int,int> > G[N_MAX];
vector <pair <int,int> > Sol;

int T[N_MAX],D[N_MAX];
bool U[N_MAX];

int N,cost=0;

inline void Write_Data()
{
   vector <pair <int,int> > :: iterator it;
   pair <int,int> val;
   printf("%d\n",Sol.size());
   for (it=Sol.begin();it!=Sol.end();++it)
   {
       val=*it;
       printf("%d %d\n",val.first,val.second);
   }
   return;
}

inline void APM(int x)
{
    int Min,nod,i;
    vector <pair <int,int> > :: iterator it;
    pair <int,int> y;
    for (it=G[x].begin();it!=G[x].end();++it)
    {
        y=*it;
        D[y.v]=y.c;
        T[y.v]=x;
    }
    U[x]=true;
    T[x]=0;
    while (1)
    {
        Min=INF;
        nod=-1;
        for (i=1;i<=N;i++)
            if (!U[i] && Min>D[i])
                    {
                        Min=D[i];
                        nod=i;
                    }
        if (Min==INF) break;
        U[nod]=true;
        cost+=D[nod];
        Sol.pb(make_pair(T[nod],nod));
        for (it=G[nod].begin();it!=G[nod].end();++it)
        {
            y=*it;
            if (D[y.v]>y.c)
                {
                    D[y.v]=y.c;
                    T[y.v]=nod;
                }
        }
    }
    printf("%d\n",cost);
}
inline void Load_Data()
{
    int M,i,x,y,k;
    scanf("%d%d",&N,&M);
    for (i=1;i<=M;++i)
    {
        scanf("%d%d%d",&x,&y,&k);
        G[x].pb(make_pair(y,k));
        G[y].pb(make_pair(x,k));
    }
    for (i=1;i<=N;i++)
    {
        D[i]=INF; U[i]=false;
    }
}
int main()
{
    freopen("apm.in","r",stdin);
    freopen("apm.out","w",stdout);
    Load_Data();
    APM(1);
    Write_Data();
    fclose(stdin);
    fclose(stdout);
    return 0;
}