最小生成树(prim&kruskal)
最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改。先把算法过程记下来:
prime算法:
原始的加权连通图——————D被选作起点,选与之相连的权值最小的边
选与D、A相连权值最小的边——————可选的有B(7)、E(8)、G(11)
————————————————————————重复上述步骤,最小生成树
代码:
用maze[M][M]存两点间的长度,vis[M]判断是否使用此边,dis[M]记录最小生成树的权值。
(代码来自学长发的模板)
#include"iostream"
#include"cstring"
#include"cstdio" #define INF 0x7f7f7f7f
#define MAXN 1005 using namespace std; int n,m;
int maze[MAXN][MAXN];
bool vis[MAXN];
int dis[MAXN]; void prim()
{
int ans = ;
dis[] = ;
for(int i = ;i <= n;i++)
{
int mark = INF;
int minn = INF;
for(int j = ;j <= n;j++)
{
if(!vis[j] && dis[j] < minn)//判断每次选的都是当前情况下的最小权值
{
minn = dis[j];
mark = j;
}
}
vis[mark] = true;
ans += dis[mark];
for(int j = ;j <= n;j++)
{
if(!vis[j] && maze[mark][j] < dis[j]) //选边
{
dis[j] = maze[mark][j];
}
}
}
printf("%d\n",ans);
} int main(void)
{
while(~scanf("%d%d",&n,&m))
{
memset(maze,INF,sizeof(maze));
memset(vis,false,sizeof(vis));
memset(dis,INF,sizeof(dis));
while(m--)
{
int x,y,len;
scanf("%d%d%d",&x,&y,&len);
if(x != y && maze[x][y] > len)//初始化两点间的权值
{
maze[x][y] = len;
maze[y][x] = len;
}
}
prim();
}
return ;
}
——prim
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~·*****************************************************************************************************************`~~~
kruskal算法:
—————————————————————————把边排序,先选定最小的边
——————依次找边——————————————————
————————最小生成树
代码好像有点复杂,要用上并查集,决定结合多方自己补个模板(✿◡‿◡)
struct node
{
int st,en,len;
}e[];
int n,m;
int fa[];
bool cmp(const node &n1,const node&n2)
{
return n1.len<n2.len;
}
int findx(int x)//并查集的find
{
if(fa[x]==x) return fa[x];
else
return fa[x]=findx(fa[x]);
}
int kruskal()
{
int ans=;
for(int i=;i<=n;i++) fa[i]=i;//初始化并查集
for(int i=;i<=m;i++)
scanf("%d%d%d",&e[i].st,&e[i].en,&e[i].len);
sort(e+,e+m+,cmp);
for(int i=;i<=m;i++)
{
int fx=findx(e[i].st),fy=findx(e[i].en);
if(fx!=fy)
{
ans+=
fa[fx]=fy;//最小生成树,已结找到的边有同一个父亲
}
} return ans;
}
void judge()
{
int flag=,term=findx();
for(int i=;i<=n;i++)//判断是否连通
{
if(findx(i)!=term)
{
flag=;
break;
}
}
}
——kruskal
图片来自:
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html
最小生成树(prim&kruskal)的更多相关文章
- 最小生成树 Prim Kruskal
layout: post title: 最小生成树 Prim Kruskal date: 2017-04-29 tag: 数据结构和算法 --- 目录 TOC {:toc} 最小生成树Minimum ...
- 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...
- 数据结构学习笔记05图(最小生成树 Prim Kruskal)
最小生成树Minimum Spanning Tree 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 树: 无回路 |V|个顶 ...
- 布线问题 最小生成树 prim + kruskal
1 : 第一种 prime 首先确定一个点 作为已经确定的集合 , 然后以这个点为中心 , 向没有被收录的点 , 找最短距离( 到已经确定的点 ) , 找一个已知长度的最小长度的 边 加到 s ...
- POJ 1258 Agri-Net(最小生成树 Prim+Kruskal)
题目链接: 传送门 Agri-Net Time Limit: 1000MS Memory Limit: 10000K Description Farmer John has been elec ...
- 最小生成树-Prim&Kruskal
Prim算法 算法步骤 S:当前已经在联通块中的所有点的集合 1. dist[i] = inf 2. for n 次 t<-S外离S最近的点 利用t更新S外点到S的距离 st[t] = true ...
- 邻接表c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
graph.c #include <stdio.h> #include <stdlib.h> #include <limits.h> #include " ...
- poj1861 最小生成树 prim & kruskal
// poj1861 最小生成树 prim & kruskal // // 一个水题,为的仅仅是回味一下模板.日后好有个照顾不是 #include <cstdio> #includ ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
随机推荐
- Flyout中ComboBox失效
参见这篇文章:https://blogs.msdn.microsoft.com/wsdevsol/2016/09/14/combobox-from-an-appbarbutton-loses-mous ...
- javascript 基础
javascript概述: javascript历史: * 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEas ...
- memcache占用CPU过高的解决办法
Simon最近为公司服务器操碎了心 , 先是mysqld进程占用CPU过高 , 导致服务器性能变低 ,网站打开太慢.通过增加max_connections及table_cache解决了问题 ,随后发现 ...
- 《C编译器剖析》后记
这本书的序言.后记写的都让我很有感触!mark: 后 记 总有曲终人散时,不知不觉我们已经完成了对UCC 编译器的剖析,一路走来,最深的体会仍然是“纸上得来终觉浅,绝知此事要躬行”.按这个道理,理解U ...
- iife js
摘自:http://dz.sdut.edu.cn/blog/subaochen/2016/02/%E8%AF%B4%E4%B8%80%E8%AF%B4js%E7%9A%84iife/ 1 定义 IIF ...
- Scrum Meeting 20161205
本周Sprint Master 史少帅 一. 会议概要 作为一个新的sprint的开端,本次scrum meeting总结了每个人过去以来的工作,并明确了下一步的计划,具体如下: 工作总结: · 陈双 ...
- python安装、模块安装
python安装 windows 下载安装包 https://www.python.org/downloads 改环境变量 [右键计算机]-->[属性]-->[高级系统设置]-->[ ...
- PHP基础之PDO
简介 PDO(PHP Data Object)是指PHP数据对象,它定义了一个轻量级的一致接口来统一操作各种数据库.PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方 ...
- 网络抓包wireshark(转)
转自 网络抓包wireshark 抓包应该是每个技术人员掌握的基础知识,无论是技术支持运维人员或者是研发,多少都会遇到要抓包的情况,用过的抓包工具有fiddle.wireshark,作为一个不是经 ...
- sql 批量更新某个字段的值
UPDATE Tabel1 t1 set t1.col1= ( SELECT col2 from Tabel2 t2 WHERE t1.col1=t2.col2) where exists ( SEL ...