数据结构之无向网(邻接矩阵)之基本操作(含Prim)

来源:互联网 发布:aws s3 php 上传 编辑:程序博客网 时间:2024/05/22 01:39
#include<iostream>using namespace std;#define MAXVEX 100#define INFINITY 65535typedef char VNode;typedef int ANode;typedef struct MGraph{VNode Vex[MAXVEX];ANode Arc[MAXVEX][MAXVEX];int Vnums;int Anums;}MGraph;void CreateAGraph(MGraph &G){int i, j, k;cin >> G.Vnums >> G.Anums;for (i = 0; i < G.Vnums; ++i)cin >> G.Vex[i];for (i = 0; i < G.Vnums; ++i)for (j = 0; j < G.Vnums; ++j)G.Arc[i][j] = 0;for (k = 0; k < G.Anums; ++k){cin >> i >> j;if (i != j){G.Arc[i][j] = 1;G.Arc[j][i] = G.Arc[i][j];}}}void CreateNGraph(MGraph &G){int i, j, k;ANode w;cin >> G.Vnums >> G.Anums;for (i = 0; i < G.Vnums; ++i)cin >> G.Vex[i];for (i = 0; i < G.Vnums; ++i)for (j = 0; j < G.Vnums; ++j)G.Arc[i][j] = INFINITY;for (k = 0; k < G.Anums; ++k){cin >> i >> j >> w;if (i != j){G.Arc[i][j] = w;G.Arc[j][i] = G.Arc[i][j];}}}int LocateVex(MGraph G, VNode v){int i;for (i = 0; i<G.Vnums; ++i)if (G.Vex[i] == v)return i;return -1;}VNode GetVex(MGraph G, int i){if (i >= G.Vnums || i < 0)exit(-1);return G.Vex[i];}bool PutVex(MGraph &G, VNode v, VNode value){int i;i = LocateVex(G, v);if (i < 0)return false;G.Vex[i] = value;return true;}int FirstAdjvexA(MGraph G, VNode v){int k, i;k = LocateVex(G, v);for (i = 0; i < G.Vnums; ++i)if (G.Arc[k][i])return i;return -1;}int FirstAdjvexN(MGraph G, VNode v){int i, k;k = LocateVex(G, v);for (i = 0; i < G.Vnums; ++i)if (G.Arc[k][i] != INFINITY)return i;return -1;}int NextAdjvexA(MGraph G, VNode v, VNode w){int i, k1, k2;k1 = LocateVex(G, v);k2 = LocateVex(G, w);for (i = k2 + 1; i < G.Vnums; ++i)if (G.Arc[k1][i])return i;return -1;}int NextAdjvexN(MGraph G, VNode v, VNode w){int i, k1, k2;k1 = LocateVex(G, v);k2 = LocateVex(G, w);for (i = k2 + 1; i < G.Vnums; ++i)if (G.Arc[k1][i] != INFINITY)return i;return -1;}void InsertVexA(MGraph &G, VNode v){int i;G.Vex[G.Vnums] = v;for (i = 0; i <= G.Vnums; i++){G.Arc[G.Vnums][i] = 0;G.Arc[i][G.Vnums] = 0;}G.Vnums++;}void InsertVexN(MGraph &G, VNode v){int i;for (i = 0; i <= G.Vnums; ++i){G.Arc[i][G.Vnums] = INFINITY;G.Arc[G.Vnums][i] = INFINITY;}G.Vnums++;}bool DeleteVexA(MGraph &G, VNode v){int i,j,k;k = LocateVex(G, v);if (k < 0)return false;for (j = 0; j < G.Vnums; ++j)if (G.Arc[k][j])G.Anums--;for (j = k + 1; j < G.Vnums; ++j)G.Vex[j-1] = G.Vex[j];for (i = 0; i < G.Vnums;++i)for (j = k + 1; j < G.Vnums; ++j)G.Arc[i][j - 1] = G.Arc[i][j];for (i = 0; i < G.Vnums; i++)for (j = k + 1; j < G.Vnums; ++j)G.Arc[j - 1][i] = G.Arc[j][i];G.Vnums--;return true;}bool DeleteVexN(MGraph &G, VNode v){int i, j, k;VNode min = 0;k = LocateVex(G, v);if (k < 0)return false;for (j = 0; j < G.Vnums; ++j)if (G.Arc[k][j]!=INFINITY)G.Anums--;for (j = k + 1; j < G.Vnums; ++j)G.Vex[j - 1] = G.Vex[j];for (i = 0; i < G.Vnums; ++i)for (j = k + 1; j < G.Vnums; ++j)G.Arc[i][j - 1] = G.Arc[i][j];for (i = 0; i < G.Vnums; i++)for (j = k + 1; j < G.Vnums; ++j)G.Arc[j - 1][i] = G.Arc[j][i];G.Vnums--;return true;}bool InsertArcA(MGraph &G, VNode v,VNode w){int i, j;i = LocateVex(G, v);j = LocateVex(G, w);if (i < 0 || j < 0)return false;G.Anums++;G.Arc[i][j] = 1;G.Arc[j][i] = G.Arc[i][j];}bool InsertArcN(MGraph &G, VNode v, VNode w){int i, j;i = LocateVex(G, v);j = LocateVex(G, w);if (i < 0 || j < 0)return false;G.Anums--;G.Arc[i][j] = INFINITY;G.Arc[j][i] = G.Arc[i][j];}bool DeleteArcA(MGraph &G, VNode v, VNode w){int i, j;i = LocateVex(G, v);j = LocateVex(G, w);if (i < 0 || j < 0)return false;G.Anums--;G.Arc[i][j] = 0;G.Arc[j][i] = G.Arc[i][j];}bool DeleteArcN(MGraph &G, VNode v, VNode w){int i, j;i = LocateVex(G, v);j = LocateVex(G, w);if (i < 0 || j < 0)return false;G.Anums--;G.Arc[i][j] = INFINITY;G.Arc[j][i] = G.Arc[i][j];}void VisitVex(VNode v){cout << v << " ";}void VisitArc(ANode c,int i,int j){cout << "(" << i << "->" << j << "," << c << ") ";}void AGraphPrint(MGraph G){int i, j;for (i = 0; i < G.Vnums; ++i)VisitVex(G.Vex[i]);for (i = 0; i < G.Vnums; ++i)for (j = 0; j < G.Vnums; ++j)if (G.Arc[i][j])VisitArc(G.Arc[i][j], i, j);}void NGraphPrint(MGraph G){int i, j;for (i = 0; i < G.Vnums; ++i)VisitVex(G.Vex[i]);for (i = 0; i < G.Vnums; ++i)for (j = 0; j < G.Vnums; ++j)if (G.Arc[i][j] != INFINITY)VisitArc(G.Arc[i][j], i, j);}bool VisitTag[MAXVEX];void DFS(MGraph G, int i){int j;VisitVex(G.Vex[i]);VisitTag[i] = true;for (j = FirstAdjvexN(G, G.Vex[i]); j >= 0; j = NextAdjvexN(G, G.Vex[i], G.Vex[j]))if (!VisitTag[j])DFS(G, j);}void DFST(MGraph G){int i;for (i = 0; i < G.Vnums; ++i)VisitTag[i] = false;for (i = 0; i < G.Vnums; ++i)if (!VisitTag[i])DFS(G, i);cout << endl;}/******************************************************/#define QSIZE MAXVEXtypedef struct Queue{int *pBase;int Front;int Rear;}Queue;void InitQueue(Queue &Q){Q.pBase = new int[QSIZE];Q.Front = 0;Q.Rear = 0;}bool QueueFull(Queue Q){if ((Q.Rear + 1) % QSIZE == Q.Front)return true;elsereturn false;}bool QueueEmpty(Queue Q){if (Q.Rear == Q.Front)return true;elsereturn false;}void EnQueue(Queue &Q, int i){if (QueueFull(Q))return;Q.pBase[Q.Rear] = i;Q.Rear = (Q.Rear + 1) % QSIZE;}void DeQueue(Queue &Q, int &i){if (QueueEmpty(Q))return;i = Q.pBase[Q.Front];Q.Front = (Q.Front + 1) % QSIZE;}void BFST(MGraph G){int i, j;Queue Q;InitQueue(Q);for (i = 0; i < G.Vnums; ++i)VisitTag[i] = false;for (i = 0; i < G.Vnums; ++i){if (!VisitTag[i]){VisitVex(G.Vex[i]);VisitTag[i] = true;EnQueue(Q, i);while (!QueueEmpty(Q)){DeQueue(Q, i);for (j = FirstAdjvexN(G, G.Vex[i]); j >= 0; j = NextAdjvexN(G, G.Vex[i], G.Vex[j])){if (!VisitTag[j]){VisitVex(G.Vex[j]);VisitTag[j] = true;EnQueue(Q, j);}}}}}cout << endl;}/*******************************************************/typedef struct{int adjvex;ANode lowcost;}Miniside[MAXVEX];int LocateMiniMum(Miniside SZ,MGraph G){int i=0, j, k, min;while (!SZ[i].lowcost)++i;min = SZ[i].lowcost;k = i;for (j = i + 1; j < G.Vnums;++j){if (SZ[j].lowcost>0 && SZ[j].lowcost<min){min = SZ[j].lowcost;k = j;}}return k;}void PrimMiniTree(MGraph G,VNode v){int i, j, k;int sum=0;Miniside SZ;k = LocateVex(G, v);for (j = 0; j < G.Vnums; ++j){SZ[j].adjvex = k;SZ[j].lowcost = G.Arc[k][j];}SZ[k].lowcost = 0;for (i = 1; i < G.Vnums; ++i){k = LocateMiniMum(SZ, G);VisitArc(SZ[k].lowcost, SZ[k].adjvex, k);sum += SZ[k].lowcost;SZ[k].lowcost = 0;for (j = 0; j < G.Vnums;++j){if (G.Arc[k][j] < SZ[j].lowcost){SZ[j].lowcost = G.Arc[k][j];SZ[j].adjvex = k;}}}}/********************************************************/int main(void){MGraph G;CreateNGraph(G);DFST(G);BFST(G);VNode v = 'B';PrimMiniTree(G, v);return(0);}

0 0
原创粉丝点击