C++ Prim算法构造可以使n个城市连接的最小生成树
来源:互联网 发布:单机免费版进存销软件 编辑:程序博客网 时间:2024/06/13 22:07
问题描述:给定一个地区的n个城市间的距离网,用Prim算法建立最小生成树,并计算得到的最小生成树的代价。
基本要求:
1、城市间的距离网采用邻接矩阵表示,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。(要求至少10个城市,15条边)
2、最小生成树中包括的边及其权值,并显示得到的最小生成树的代价。
头文件.h
//// MGraph.h// Prim_XCode//// Created by Holy-C on 14/12/22.// Copyright (c) 2014年 lyc. All rights reserved.//#ifndef MGraph_H#define MGraph_H#include <iostream>#include <iomanip>using namespace std;#define MaxSize 30#define INFINITYN 65536 //表示权值无限大struct shortEdge //辅助数组{ int lowcost; int adjvex;};template <class DataType>class MGraph{private: DataType vertex[MaxSize]; //存放顶点的数组 int arcs[MaxSize][MaxSize]; //存放图中边的数组 int versNum, arcsNum; //定点数和边数 shortEdge shortEdge[MaxSize]; public: MGraph(); //初始化邻接矩阵 ~MGraph(){} void CreateMGraph(); void printMGraph(); void Prim(); //Prim算法生成最小生成树};template <class DataType>MGraph<DataType>::MGraph(){ cout << "请输入顶点数和边数:" << endl; cin >> versNum >> arcsNum; cout << "请输入顶点字符信息(" << versNum << "个):" << endl; for (int i = 0; i < versNum; i++) { cin >> vertex[i]; } for (int i = 0; i < versNum; i++) { for (int j = 0; j < versNum; j++) { if (i == j) arcs[i][j] = 0; else arcs[i][j] = INFINITYN; } }}template <class DataType>void MGraph<DataType>::CreateMGraph(){ int i, j, w; cout << "请输入边<Vi,Vj>对应的顶点序号(" << arcsNum << "对),以及权值:" << endl; for (int k = 0; k < arcsNum; k++) { cin >> i >> j >> w; arcs[i][j] = w; arcs[j][i] = w; }}template <class DataType>void MGraph<DataType>::printMGraph(){ cout << "邻接矩阵为:" << endl; for (int i = 0; i < versNum; i++) { for (int j = 0; j < versNum; j++) { if (arcs[i][j] == 65536) cout <<" "<< setw(5) << "∞"; else cout << setw(5) << arcs[i][j]; } cout << endl; cout << endl; }}template <class DataType>void MGraph<DataType>::Prim(){ int k, w, cost = 0; for (int i = 1; i < versNum; i++) { shortEdge[i].lowcost = arcs[0][i]; shortEdge[i].adjvex = 0; } shortEdge[0].lowcost = 0; for (int i = 1; i < versNum; i++) { w = INFINITYN; for (int j = 1; j < versNum; j++)/* 在辅助数组closedge中选择权值最小的顶点*/ { if (shortEdge[j].lowcost != 0 && shortEdge[j].lowcost < w) { w = shortEdge[j].lowcost; k = j; } /* 求出生成树的下一个顶点k */ } shortEdge[k].lowcost = 0; for (int j = 1; j < versNum; j++) { if (arcs[k][j] < shortEdge[j].lowcost) { shortEdge[j].lowcost = arcs[k][j]; shortEdge[j].adjvex = k; } } } cout << "最小生成树为:" << endl; for (int i = 1; i < versNum; i++) { cout << i << "->" << shortEdge[i].adjvex << "," << arcs[i][shortEdge[i].adjvex] << endl; cost = cost + arcs[i][shortEdge[i].adjvex]; } cout << "最小生成树代价为:" << cost << endl;}#endif
以下是测试函数:
// // main.cpp // Prim_XCode // // Created by Holy-C on 14/12/22. // Copyright (c) 2014年 lyc. All rights reserved. // #include "MGraph.h" #include <iostream> using namespace std; int main() { MGraph<int> m1; m1.CreateMGraph(); m1.printMGraph(); m1.Prim(); }
测试数据:
1 0
- C++ Prim算法构造可以使n个城市连接的最小生成树
- 构造最小生成树的 prim 算法
- 构造最小生成树的算法——Prim算法
- Prim算法构造最小生成树
- Prim算法构造最小生成树
- Prim算法构造最小生成树
- 最小生成树Prim算法C语言
- Prim最小生成树算法(C++)
- 最小生成树--prim算法的c语言描述
- 图的最小生成树Prim算法朴素版(C++)
- Prim算法求图的最小生成树--C代码
- C语言实现图的Prim最小生成树算法
- Prim 算法生成的最小生成树
- Prim算法和Kruskal算法构造最小生成树
- Prim 算法求最小生成树 O(n^2)
- Prim 算法求最小生成树 O(n^2)
- 最小生成树的prim算法代码
- 最小生成树的prim算法实现
- 视频网址编码
- 苹果WWDC大秀软实力 国内外智能生态战升级
- 斗牛游戏的概率探索
- Python 2.7 Data Type for Text Strings: Unicode and Str
- THINKPHP框架的优秀开源系统推荐
- C++ Prim算法构造可以使n个城市连接的最小生成树
- 网站上mài的强效苍蝇露什么价
- 数字证书简介
- 艾森哲面试 Accenture
- 网上专mài迷昏香
- lldb 调试
- MatrixState中的参数与 CP_Na_Cl中参数的比较
- SAT几何专业词汇一览
- 基于jquery的ajax 异步获取json