Pagini recente » Cod sursa (job #254827) | Cod sursa (job #64455) | Cod sursa (job #239784) | Cod sursa (job #3001240) | Cod sursa (job #660303)
Cod sursa(job #660303)
/* 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();
}