[置顶] 最小生成树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 ...
随机推荐
- Webform——Repeater多表联合显示
对于一个表里,通过外键连接如何显示另一个表的数据,前Winform里可以用封装类来实现. 对于Webform,可以用封装类,也可以用Repeater的ItemDataBound事件(//在项被绑定数据 ...
- [转载]Java的内存回收机制
转自:http://www.admin10000.com/document/1671.html 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由J ...
- mac osx 升级yosemite后java出错的解决
原文 http://www.cnblogs.com/walkerwang/p/4034152.html
- 学习面试题Day03
1.Java中的注释有哪些? 如果不算Annotation,Java的注释有3种,即行注释.块注释和文档注释.它们往往适合于不同地方的注释,其中文档注释比较特殊,它的注释信息可以进入到javadoc文 ...
- error MSB3027: Could not copy "xxx.dll" to "xxx.dll". Exceeded retry count of 10. Failed.
错误提示内容: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3363,5): error MSB302 ...
- codeforces 672C - Recycling Bottles 贪心水题
感觉很简单,就是讨论一下 #include <stdio.h> #include <string.h> #include <algorithm> #include ...
- Appium原理
Appium原理小结 Api接口调用selenium的接口,android底层用android的instrumentation(API2.3+ 通过绑定另外一个独立的selendroid项目来实现的) ...
- Mac下安装Mysql出现 Can’t connect to local MySQL server through socket '/tmp/mysql.sock'
在Mac下安装mysql出现 Can't connect to local MySQL server through socket '/tmp/mysql.sock' 错误,解决如下: $ unset ...
- 时间管理(GTD)
今天中午看了30分钟老王讲战胜拖延症和时间管理 视频地址:多呗课堂 贴两个总结的图在此: 计划中使用的四象限法和十八分钟法很好. 今年多研究研究,实践一下Geting Things Done.
- FL2440移植Linux2.6.33.7内核
kernel version:2.6.33.7 /linux-2.6.33.7 OS:CentOS 6.4 cross-compilation chain:arm-linux-4.3.2 /usr/l ...