Cod sursa(job #660303)

Utilizator dacyanMujdar Dacian dacyan Data 12 ianuarie 2012 02:21:51
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
/*      Algoritmul lui Prim

- determina APN (MST)
ALG: 1) -se selecteaza un nod
     2) -se alege o "muchie usoara" de cost minim
     3) -se repeta pasul 2)
*/

#include <fstream>
#include <vector>
#define DIM 101
#define INF 0x3f3f3f3f
using namespace std;

int n, m, nrm, ctotal;
vector<pair<int, pair<int,int> > > G, arb;
bool s[DIM];

void Read();
void Prim();
void Write();

int main()
{
    Read();
    Prim();
    Write();
    return 0;
}

void Read()
{
    ifstream fin("apm.in");
    fin >> n >> m;
    int x, y, c;
    arb.resize(n+1);
    while (fin >> x >> y >> c)
        G.push_back(make_pair(c,make_pair(x,y)));
    fin.close();
}

void Prim()
{
    s[1] = true;
    pair<int, pair<int,int> > x;
    while (nrm < n - 1)
    {
        int mn = INF, v1, v2, cost;
        for (int i = 0; i < G.size(); ++i)
        {
            cost = G[i].first;
            v1 = G[i].second.first;
            v2 = G[i].second.second;
            if (s[v1] && !s[v2] || !s[v1] && s[v2])
                if (cost < mn)
                {
                    mn = cost;
                    x = G[i];
                }
        }
        ctotal += mn;
        arb[nrm++] = x;
        if (!s[x.second.second]) s[x.second.second] = true;
        else s[x.second.first] = true;
    }
}

void Write()
{
    ofstream fout("apm.out");
    fout << ctotal << '\n';
    for (int i = 0; i < nrm; ++i)
        fout << arb[i].second.first << ' ' << arb[i].second.second << ' ' << arb[i].first << '\n';
    fout.close();
}