1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <iostream> #include <vector> #include <algorithm> using namespace std; // 邻接矩阵 - 最小生成树 - Prim算法
#define Maxdist 10000000 #define MaxVertexNum 100 // 最大顶点数 typedef int WeightType; // 权值 typedef int Vertex; // 顶点 typedef int DataType; // 数据
vector <int> dist(MaxVertexNum, Maxdist); // 存储距离, 并初始化为 Maxdist vector <Vertex> parent(MaxVertexNum, -1); // 储存父节点, 并初始化为 -1 vector <Vertex> MST; // 最小生成树
// 边 typedef struct ENode *PtrToENode; struct ENode{ Vertex V1, V2; // < V1, V2 > 有向边 WeightType Weight; // 权重 }; typedef PtrToENode Edge;
// 图 typedef struct GNode *PtrToGNode; struct GNode{ int Nv; // 顶点数 int Ne; // 边数 WeightType G[MaxVertexNum][MaxVertexNum]; // 邻接矩阵 DataType Data[MaxVertexNum]; // 数据 }; typedef PtrToGNode MGraph;
// 操作集 void initPrim(Vertex s); // 初始化 Prim int FindMinVertex(MGraph Graph, Vertex v); // 找出dist最小值 void Prim(MGraph Graph, Vertex s); // Prim算法
void initPrim(MGraph Graph, Vertex s) { MST.push_back(s), dist[s] = 0; for(Vertex w=0; w<Graph->Nv; w++) if(Graph->G[s][w]) dist[w] = Graph->G[s][w], parent[w] = s; }
int FindMinVertex(MGraph Graph, Vertex v) { Vertex vMin = -1; int minV = Maxdist; for(Vertex w=0; w<Graph->Nv; w++) if(dist[w] && dist[w] < minV) minV = dist[w], vMin = w; return vMin; }
void Prim(MGraph Graph, Vertex s) { initPrim(Graph, s); Vertex v; int cnt=1; while(1) { v = FindMinVertex(Graph, v); if(v==-1) break; MST.push_back(v), dist[v] = 0, cnt++;
for(Vertex w=0; w<Graph->Nv; w++) if(dist[w] && Graph->G[v][w]) if(Graph->G[v][w] < dist[w]) dist[w] = Graph->G[v][w], parent[w] = v;
if(cnt < Graph->Nv) cout << "Bu Lian Tong !" << endl; } }
|