[置顶] 最小生成树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 ...
随机推荐
- .woff 文件404,配置到web.config
<staticContent> <remove fileExtension=".woff" /> <mimeMap fil ...
- poj2392
首先按限制高度排序,然后按多重背包做dp 这里的背包只用知道每种状态是否可行,所以 这里的多重背包可以变成O(nm) ; ..,..,..] of longint; a,b:..] of lo ...
- UVa 11040 (水题) Add bricks in the wall
题意: 45块石头如图排列,每块石头上的数等于下面支撑它的两数之和,求其余未表示的数. 分析: 首先来计算最下面一行的数,A71 = A81 + A82 = A91 + 2A92 + A93,变形得到 ...
- TCP编程(七)
此为网络编程的一个系列,后续会把内容补上...
- 多线程程序设计学习(11)Two-phapse-Termination pattern
Two-phapse-Termination[A终止B线程] 一:Two-phapse-Termination的参与者--->A线程--->B线程 二:Two-phapse-Termina ...
- CF GYM 100703K Word order
题意:给一个字符串,其中只有F.A.N三种字母,问最少交换多少次能使所有的A在所有F之前. 解法:贪心.先预处理每位的左边有多少F右边有多少A,对于每位A必须至少向左交换的次数为它左面的F个数,而对于 ...
- PICT实现组合测试用例(二)
上次简单总结了PICT命令的一些用法,这次重新把<软件测试实战>里面有关这一章的内容再总结一次,以巩固理解. 组合测试的概念 组合测试(combinatorial testing)是一种测 ...
- bindService和startService的区别
区别: startService,关闭服务退出activity,service仍然处于后台运行 bindService,关闭服务退出activity直接stopService,停止服务 bindSer ...
- python网络编程(六)---web客户端访问
1.获取web页面 urllib2 支持任何协议的工作---不仅仅是http,还包括FTP,Gopher. import urllib2 req=urllib2.Request('http://www ...
- Android 数据存储相关
Application使用总结:http://www.tuicool.com/articles/JVBja2 枚举 Map<>