[置顶] 最小生成树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 ...
随机推荐
- bzoj1293: [SCOI2009]生日礼物
单调队列 用一个堆维护目前每个颜色在里面的点,每回取出队首点,并更新答案.一旦哪个颜色的点都被用完,跳出循环. #include<cstdio> #include<algorithm ...
- Java [Leetcode 42]Trapping Rain Water
题目描述: Given n non-negative integers representing an elevation map where the width of each bar is 1, ...
- 【转】 Android 开发 之 JNI入门 - NDK从入门到精通
原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub ...
- C# 实例化顺序
static class Program { static void Main() { BaseB baseb = new BaseB(); baseb.MyFun(); Console.ReadKe ...
- CSS布局中——导航是非常常见的
导航绝对是页面布局中最常见的,为了不用每次去写,稍微贴个简单的导航模版出来,方便以后使用. <title>CSS菜单</title> <style type=" ...
- 【转】angular Ajax请求
1.http请求 基本的操作由 $http 服务提供.它的使用很简单,提供一些描述请求的参数,请求就出去了,然后返回一个扩充了 success 方法和 error 方法的 promise对象(下节介绍 ...
- nopcommerce商城系统--源代码结构和架构
这个文档是让开发者了解nopcommerce解决方案结构的指南.这是新的nopcommerce开发者学习nopcommerce代码的相关文档.首先,nopCommerce源代码是很容易得到的.它是一个 ...
- 10、Android数据存储
课程目标: 掌握Android中数据存储的几种方式 熟练使用PreferenceActivity&PreferenceScreen做专业的Setting功能 熟练使用SQLite3来存储数据 ...
- 在FOR中使用close window,循环次数大于1就会报异常
在FOR循环中执行以下动作: 场景:1.打开页面A, 2.点击A中的链接打开新的window, 3.将driver切换到新window, 4.close window 5.再切换到页面A 时出异 ...
- as3 工具类分享 CookieMgr
今天分享一个工具类 CookieMgr,功能就是读取和写入 SharedObject 对象.很简单,都是静态方法,就不多说了 package org.polarbear.core { import f ...