[置顶] 最小生成树Prim算法
二话不说直接贴代码
原图传送门:http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/minispantree.asp
但是上面展现的是克鲁斯卡尔算法。我这里是普里姆算法。
#include <iostream>
#include <list>
#include <deque>
#include <algorithm>
using namespace std; typedef struct Line
{
int Dot1;
int Dot2;
int Power;
}Line; static const int arr[] = {0,1,6,
0,2,1,
0,3,5,
1,2,5,
1,4,3,
2,3,7,
2,4,5,
2,5,4,
3,5,2,
4,5,6
}; void BuildMap(list<Line>& vet)
{
/*do
{
Line temp;
cin>>temp.Dot1>>temp.Dot2>>temp.Power;
vet.push_back(temp);
}while(getchar() != '#');*/
for(int i = 0;i < sizeof(arr)/(sizeof(int)*3);++i)
{
Line temp;
temp.Dot1 = arr[i*3];
temp.Dot2 = arr[i*3+1];
temp.Power = arr[i*3+2];
vet.push_back(temp);
}
} void MST(list<Line>&map,list<Line>& tree)
{
list<Line *> Open;
list<int> OpenId;
for(auto p = map.begin();p != map.end();++p)
{
Open.push_back(&*p);
if(find(OpenId.begin(),OpenId.end(),p->Dot1) == OpenId.end())
OpenId.push_back(p->Dot1);
if(find(OpenId.begin(),OpenId.end(),p->Dot2) == OpenId.end())
OpenId.push_back(p->Dot2);
}
Open.sort([](const Line* a,const Line* b){return a->Power < b->Power;});//支持C++11的编译器
tree.push_back(**Open.begin());
OpenId.erase(find(OpenId.begin(),OpenId.end(),(*Open.begin())->Dot1));
OpenId.erase(find(OpenId.begin(),OpenId.end(),(*Open.begin())->Dot2));
Open.pop_front();
auto q = Open.begin();
while(!OpenId.empty())
{
if(find(OpenId.begin(),OpenId.end(),(*q)->Dot1) == OpenId.end()
&& find(OpenId.begin(),OpenId.end(),(*q)->Dot2) == OpenId.end())
{//已加入
Open.erase(q);
q = Open.begin();
}
else if(find(OpenId.begin(),OpenId.end(),(*q)->Dot1) == OpenId.end()
|| find(OpenId.begin(),OpenId.end(),(*q)->Dot2) == OpenId.end())
{//已加入
if(find(OpenId.begin(),OpenId.end(),(*q)->Dot1) == OpenId.end())
OpenId.erase(find(OpenId.begin(),OpenId.end(),(*q)->Dot2));
else if(find(OpenId.begin(),OpenId.end(),(*q)->Dot2) == OpenId.end())
OpenId.erase(find(OpenId.begin(),OpenId.end(),(*q)->Dot1));
tree.push_back(**q);
Open.erase(q);
q = Open.begin();
}
else
{
++q;
}
}
} int main()
{
list<Line> map;
list<Line> tree;
BuildMap(map);
MST(map,tree);
return 0;
}
[置顶] 最小生成树Prim算法的更多相关文章
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析
最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...
- 最小生成树Prim算法(邻接矩阵和邻接表)
最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...
- 最小生成树—prim算法
最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...
- Highways POJ-1751 最小生成树 Prim算法
Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...
- SWUST OJ 1075 求最小生成树(Prim算法)
求最小生成树(Prim算法) 我对提示代码做了简要分析,提示代码大致写了以下几个内容 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值 ...
- 图论算法(五)最小生成树Prim算法
最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...
- 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
- 数据结构:最小生成树--Prim算法
最小生成树:Prim算法 最小生成树 给定一无向带权图.顶点数是n,要使图连通仅仅需n-1条边.若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost ...
随机推荐
- 解决windows下vim方向键变成 ABCD 的问题
一.问题描述: windows下面要安装git --> 安装了 msys2 -->安装并更新了 vim(7.4),然后在使用过程中发现vim不能使用 BACKSPACE 键,按方向键会打 ...
- struts2的action中获得request response session 对象
在struts2中有两种方式可以得到这些对象 1.非IoC方式 要获得上述对象,关键Struts 2中com.opensymphony.xwork2.ActionContext类.我们可以通过它的静态 ...
- Java [leetcode 31]Next Permutation
题目描述: Implement next permutation, which rearranges numbers into the lexicographically next greater p ...
- ajax检测账户是否存在
Register.cshtml <div title="账户"> 账户 <input type="text" name="Acc_a ...
- Javscript高级
Javscript高级: 函数内部属性 arguments: arguments(实参:包含所有传入方法的参数)特殊用法: arguments中有一个属性callee,是一个指针,指向拥有这个argu ...
- andorid 进度条
SeekBar类似于ProgressBar,但是ProgressBar的主要功能是让用户知道目前的状态,而SeekBar的功能在于让用户调整进度,举个例子,在音乐播放器中,可以通过调整SeekBar来 ...
- HDU4738 Caocao's Bridges 无向图的桥
一眼题:找所有的桥,然后求最小权值 但是有很多坑点 1:如果本来不联通 输出0,(这个坑我知道) 2:但是还有一个坑,就是当整个连通,最小桥的权值是0时,也必须派一个人去,wa了无数遍(还是太年轻) ...
- [JDBC-1] JDBC Base Template
以Statement建立的标准模板: static void template() throws Exception { Connection conn = null; Statement st = ...
- Selenium2Library系列 keywords 之 _SelectElementKeywords 之_get_select_list_options(self, select_list_or_locator)
def _get_select_list_options(self, select_list_or_locator): if isinstance(select_list_or_locator, Se ...
- 单元测试之获取Spring下所有Bean
单元测试中,针对接口的测试是必须的,但是如何非常方便的获取Spring注册的Bean呢? 如果可以获取所有的Bean,这样就可以将这个方法放到基类中,方便后面所有单元测试类的使用,具体实现如下: im ...