zoukankan      html  css  js  c++  java
  • 图-普利姆算法

    普利姆算法

    #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;
    }
    
  • 相关阅读:
    Linux系统编程——基于文件描述符的文件操作(2)
    Linux系统编程——基于文件描述符的文件操作(1)
    Linux系统编程——静态库和动态库
    qsort实现结构体数组排序
    C++Primer第五版——习题答案详解(十一)
    C++Primer第五版——习题答案目录
    C++Primer第五版——习题答案详解(九)
    C++Primer第五版——习题答案详解(十)
    JS 创建动态表格练习
    org.dom4j 解析XML
  • 原文地址:https://www.cnblogs.com/ygjzs/p/11886217.html
Copyright © 2011-2022 走看看