欢迎来到 跌倒的小黄瓜 的博客

♪(^∇^*)我要当大佬,(#^.^#)哈哈哈哈,(。-ω-)zzz我要成为优秀的人,(*^▽^*)٩(๑>◡<๑)۶O(∩_∩)O哈哈~~~~~~~~欢迎━(*`∀´*)ノ亻!

图-普利姆算法

普利姆算法

#include <iostream>

using namespace std;

typedef char VerTexType;
typedef int ArcType;
#define MVNum 100
#define MaxInt 32767

struct {
	VerTexType adjvex;
	ArcType lowcost;
}closedeg[MVNum];

typedef char VerTexType;
typedef int ArcType;
typedef struct {
	VerTexType vexs[MVNum];
	ArcType arcs[MVNum][MVNum];
	int vexnum, arcnum;
}AMGraph;

int LocateVex(AMGraph G, VerTexType v) {
	for (int i = 0;i < G.vexnum;++i) {
		if (G.vexs[i] == v)
			return i;
	}
	return -1;
}

void CreateUDN(AMGraph& G) {
	int i, j, k;
	cout << "请输入总顶点数,总边数,以空格隔开:";
	cin >> G.vexnum >> G.arcnum;
	cout << endl;

	cout << "输入点的名称,如a" << endl;

	for (i = 0;i < G.vexnum;++i) {
		cout << "请输入第" << (i + 1) << "个点的名称:";
		cin >> G.vexs[i];
	}
	cout << endl;

	for (i = 0;i < G.vexnum;i++) {
		for (j = 0;j < G.vexnum;++j) {
			G.arcs[i][j] == MaxInt;
		}
	}
	cout << "输入边依附的顶点及权值,如a b 5"<<endl;
	for (k = 0;k < G.arcnum;++k) {
		VerTexType v1, v2;
		ArcType w;
		cout << "请输入第" << (k + 1) << "条边依附的顶点及权值:";
		cin >> v1 >> v2 >> w;
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		G.arcs[i][j] = w;
		G.arcs[j][i] = G.arcs[i][j];
	}
}

int Min(AMGraph G) {
	int i;
	int index = -1;
	int min = MaxInt;
	for (i = 0;i < G.vexnum;++i) {
		if (min > closedeg[i].lowcost&& closedeg[i].lowcost != 0) {
			min = closedeg[i].lowcost;
			index = i;
		}
	}
	return index;
}

void MinSpanTree_Prim(AMGraph G, VerTexType u) {
	int i, j, k;
	VerTexType u0, v0;
	k = LocateVex(G, u);
	for (j = 0;j < G.vexnum;++j) {
		if (j != k) {
			closedeg[j].adjvex = u;
			closedeg[j].lowcost = G.arcs[k][j];
		}
	}
	closedeg[k].lowcost = 0;
	for (i = 1;i < G.vexnum;++i) {
		k = Min(G);
		u0 = closedeg[k].adjvex;
		v0 = G.vexs[k];
		cout << "边  " << "--->" << v0 << endl;
		closedeg[k].lowcost = 0;
		for (j = 0;j < G.vexnum;++j) {
			if (G.arcs[k][j] < closedeg[j].lowcost) {
				closedeg[j].adjvex = G.vexs[k];
				closedeg[j].lowcost = G.arcs[k][j];
			}
		}
	}
}

int main() {
	cout << "普里姆算法" << endl;
	AMGraph G;
	CreateUDN(G);
	cout << endl;
	cout << "无向图G创建完成!" << endl;

	cout << "利用普里姆算法构造最小生成树结果:" <<endl
		;
	MinSpanTree_Prim(G, '0');
	cout << endl;
	return 0;
}
posted @ 2019-11-18 22:55  跌倒的小黄瓜  阅读(406)  评论(1编辑  收藏  举报