实现prim算法
如下找出该图的最小生成树

prim算法是求解该类问题的一种经典算法
Prim算法的基本思路:
将图中的所有的顶点分为两类:树顶点(已经被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点)。首先选择任意一个顶点加入生成树,接下来要找出一条边添加到生成树,
这需要枚举每一个树顶点到每一个非树顶点所有的边,然后找到最短边加入到生成树。依次,重复操作n-1次,直到将所有顶点都加入生成树中。
算法实现如下
#include<bits/stdc++.h>
using namespace std;
void Prim(int n,int c[ ][])
{
int lowcost[];//各非树顶点到树顶点集的最短路径
int closet[];//非树顶点到树顶点集的最小边中相对的顶点
bool foot[n+];//表示是否已经为树顶点,初始为false
memset(lowcost,,sizeof(lowcost));
memset(closet,,sizeof(closet));
foot[]=true;//假设先把1作为初始顶点
for(int i=;i<=n;i++){//假设从节点一开始
foot[i]=false;
closet[i]=;
lowcost[i]=c[][i];
}
for(int i=;i<n;i++){
int min=;
int j=;
for(int k=;k<=n;k++){//计算非树顶点到树顶点集的最短路径,并把对应顶点记为j
if((lowcost[k]<min)&&(foot[k]==false)){
min=lowcost[k];
j=k;
}
}
cout <<"选边"<< "("<<closet[j] << "," <<j<<")" << endl;//把改变归为已选边,并把foot[j]设为true
foot[j]=true;
for(int k=;k<=n;k++){//由于新的顶点加入树顶点,所以要更新非树顶点到树顶点集的最短路径lowcost[j],和对应的clost[j]
if((c[j][k]<lowcost[k])&&(foot[k]==false)){
lowcost[k]=c[j][k];
closet[k]=j;
}
}
} }
int main()
{
cout << "请输入图的顶点数" << endl;
int n;
cin >>n;
cout << "请输入图的边数" << endl;
int m;
cin >> m;
cout << "请输入图的边的两个端点和边的长度" << endl;
int c[][];
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
c[i][j]=;
}
}
int i1,j,k;
for(int i=;i<=m;i++){
cin >>i1 >> j >> k;
c[i1][j]=k;
c[j][i1]=k;
}
Prim(n,c);
return ; }
运行结果如下

实现prim算法的更多相关文章
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- 最小生成树のprim算法
Problem A Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Sub ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 最小生成树——prim算法
prim算法是选取任意一个顶点作为树的一个节点,然后贪心的选取离这棵树最近的点,直到连上所有的点并且不够成环,它的时间复杂度为o(v^2) #include<iostream>#inclu ...
- 洛谷 P3366 【模板】最小生成树 prim算法思路 我自己的实现
网上有很多prim算法 用邻接矩阵 加什么lowcost数组 我觉得不靠谱 毕竟邻接矩阵本身就不是存图的好方法 所以自己写了一个邻接表(边信息表)版本的 注意我还是用了优先队列 每次新加入一个点 ...
- 最小生成树算法——prim算法
prim算法:从某一点开始,去遍历相邻的边,然后将权值最短的边加入集合,同时将新加入边集中的新点遍历相邻的边更新边值集合(边值集合用来找出新的最小权值边),注意每次更新都需将cost数组中的点对应的权 ...
- 贪心算法-最小生成树Kruskal算法和Prim算法
Kruskal算法: 不断地选择未被选中的边中权重最轻且不会形成环的一条. 简单的理解: 不停地循环,每一次都寻找两个顶点,这两个顶点不在同一个真子集里,且边上的权值最小. 把找到的这两个顶点联合起来 ...
- Prim算法(三)之 Java详解
前面分别通过C和C++实现了普里姆,本文介绍普里姆的Java实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里姆算法的代码说明 4. 普里姆算法的源码 转载请注明出处:http:// ...
- Prim算法(二)之 C++详解
本章是普里姆算法的C++实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里姆算法的代码说明 4. 普里姆算法的源码 转载请注明出处:http://www.cnblogs.com/sk ...
- Prim算法(一)之 C语言详解
本章介绍普里姆算法.和以往一样,本文会先对普里姆算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里 ...
随机推荐
- ABAP alv report
*&---------------------------------------------------------------------* *& Report YTST_FF_ ...
- C++三种继承方式
一.三种继承方式 继承方式不同,第一个不同是的是派生类继承基类后,各成员属性发生变化.第二个不同是派生类的对象能访问基类中哪些成员发生变化.表格中红色标注.
- (转).NET基础拾遗(5)多线程开发基础
https://www.cnblogs.com/edisonchou/p/4848131.html
- iOS MVVM+RAC 从基础到demo
一.关于经典模式MVC的简介 MVC是构建iOS App的标准模式,是苹果推荐的一个用来组织代码的权威范式,市面上大部分App都是这样构建的,具体组建模式不细说,iOS入门者都比较了解(虽然不一定能完 ...
- Step 0: 安装及启动
一.Setting up a Single Node Cluster: http://hadoop.apache.org/docs/r2.6.5/hadoop-project-dist/hadoop- ...
- VC DLL方法的__declspec导入导出
https://msdn.microsoft.com/zh-cn/library/a90k134d.aspx https://msdn.microsoft.com/zh-cn/library/ms23 ...
- apache-tomcat 及对应eclipse下载地址for mac
tomcat 7.0.42http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.42/bin/apache-tomcat-7.0.42.zip ...
- JavaScript--Object类
Object类是所有JavaScript类的基类,提供了一种创建自定义对象的简单方式,不需要程序员再定义构造函数. 主要属性: constructor-对象的构造函数 prototype-获得类的pr ...
- IntelliJ IDEA 的 project 和 module 区别与关系
在IDEA 创建一个project,目录结构是这样的:在project下创建一个module之后目录结构是这样的: 简单的概括如下: IntelliJ系中的 Project 相当于Eclipse系中 ...
- jQuery 获取有多个class名的元素
HTML内容: <div class="write-upload"> <p class="write-files old-files"> ...