#ifndef MSTREE_H
#define MSTREE_H
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
class Sets
{
public:
Sets(int);
void Union(int i, int j) { parent[i] = j; }
int Find(int i) { while (parent[i]>=0) i = parent[i]; return i; }
private:
int *parent;
int n;
};
Sets::Sets(int numberOfElements)
{
if (numberOfElements < 2) throw "Must have at least 2 elements.";
n = numberOfElements;
parent = new int[n];
fill(parent, parent + n, -1);
}
int NNODES;
struct Edge
{
int v1, v2;
double weight;
bool operator==(Edge& e2) { return (v1==e2.v1 && v2==e2.v2); }
bool operator!=(Edge& e2) { return (v1!=e2.v1 || v2!=e2.v2); }
};
ostream& operator<<(ostream& os, Edge& e)
{
os << "(" << e.v1 << "," << e.v2 << ") : " << e.weight << endl;
return os;
}
bool GetEdge(istream& is, Edge& e)
{
// make sure that node number is 0 to NNODES-1
is >> e.v1 >> e.v2 >> e.weight; if (!is.good())
return false;
if (e.v1<0 || e.v1>=NNODES || e.v2<0 || e.v2>=NNODES || e.v1==e.v2)
throw "Incorrect Edge";
if (e.v2 < e.v1) swap(e.v1, e.v2); // low-numbered vertex first
return true;
}
class Compare
{
public:
bool operator() (Edge e1, Edge e2) { return e1.weight > e2.weight; }
};
#endif
#include "mstree.h"
priority_queue< Edge, vector<Edge>, Compare > PQ1;
queue< Edge > *Q;
void MoveIntoPQ_EdgeOfNodes(int v) {
while( !Q[v].empty() )
{
Edge e = Q[v].front();
Q[v].pop();
PQ1.push(e);
}
}
void prim()
{
Sets sets (NNODES);
int nedges = 0;
while(nedges < NNODES - 1)
{
if(PQ1.empty() ) throw "No Spanning Tree Exists. ";
Edge e = PQ1.top(); PQ1.pop();
int root0 = sets.Find(0);
int v1root = sets.Find(e.v1); int v2root = sets.Find(e.v2);
if (v1root != v2root)
{
sets.Union(v1root, v2root);
nedges++;
cout << e;
}
}
}
void ReadEdges4prim( istream& is)
{
Q = new queue<Edge> [NNODES];
Edge e;
while (GetEdge( is, e) )
{
Q[e.v1].push(e);
Q[e.v2].push(e);
}
MoveIntoPQ_EdgeOfNodes(3);
}
int main(int argc, char *argv[])
{
ifstream is; if (argc==1) is.open("prim.in"); else is.open(argv[1]);
if (!is) { cerr << "No such input file\n"; exit(1); }
is >> NNODES;
if (NNODES < 2) { cerr << "#nodes must be 2.." << endl; exit(1); }
try { ReadEdges4prim(is); prim(); }
catch (char const *str)
{ cerr << "Exception: " << str << endl; exit(1); }
}
여기서 0부터 시작해서 쭉 이어져야 하는데
어떻게 해야될질 모르겠어요
알려주십쇼!!!
댓글 0