Cod sursa(job #1265222)

Utilizator Andrei_TirpescuAndrei Tirpescu Andrei_Tirpescu Data 16 noiembrie 2014 21:57:11
Problema Arbore partial de cost minim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <vector>
#define NMAX 200000
#define INF 1001
using namespace std;

ifstream fin("apm.in");
ofstream fout("apm.out");

int n, m;
struct vecin{
    vector<int> v;
    vector<int> c;
};
vecin G[NMAX];
int cmin[NMAX], prec[NMAX], Z[NMAX];
int cost_apm;

void init();
void prim(int);

int main(){
    init();
    prim(1);
    return 0;
}

void init(){
    fin>>n>>m;

    int i, x, y, c;
    for(i = 1; i <= m; ++i){
        fin>>x>>y>>c;
        G[x].v.push_back(y);
        G[y].v.push_back(x);

        G[x].c.push_back(c);
        G[y].c.push_back(c);
    }

    /*
    for(i = 1; i<=n; ++i){
        if(G[i].v.size() != G[i].c.size())
            fout<<"PUSH_BACK PROBLEM!!!";
    }*/

    for(i = 1; i<=n; ++i)
        cmin[i] = INF;
}

void prim(int vfs){
    int i;
    for(i = 0; i< G[vfs].c.size(); ++i){
        cmin[ G[vfs].v[i] ] = G[vfs].c[i];
        prec[ G[vfs].v[i] ] = vfs;
    }

    int nrv = 1; Z[vfs] = 1;
    int cost_minim, vfmin;
    while(nrv <= n-1){
        cost_minim = INF;
        for(i = 1; i<= n; ++i){
            if(!Z[i] && cmin[i] < cost_minim){
                vfmin = i;
                cost_minim = cmin[vfmin];
            }
        }
        //if(cost_minim == INF) break;
        Z[vfmin] = 1; cost_apm += cost_minim; ++nrv;

        for( i = 0; i < G[vfmin].v.size(); ++i){
            if( cmin[ G[vfmin].v[i] ] > G[ vfmin ].c[i] && !Z[ G[vfmin].v[i] ] ){
                cmin[ G[vfmin].v[i] ] = G[ vfmin ].c[i];
                prec[ G[vfmin].v[i] ] = vfmin;
            }
        }

    }
    fout<<cost_apm<<' '<<n-1<<'\n';
    for(i = 1; i<=n; ++i){
        if(prec[i]){
            fout<<i<<" "<<prec[i]<<"\n";
        }
    }
}