最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改。先把算法过程记下来:

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)的更多相关文章

  1. 最小生成树 Prim Kruskal

    layout: post title: 最小生成树 Prim Kruskal date: 2017-04-29 tag: 数据结构和算法 --- 目录 TOC {:toc} 最小生成树Minimum ...

  2. 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...

  3. 数据结构学习笔记05图(最小生成树 Prim Kruskal)

    最小生成树Minimum Spanning Tree 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 树: 无回路   |V|个顶 ...

  4. 布线问题 最小生成树 prim + kruskal

    1 : 第一种 prime     首先确定一个点 作为已经确定的集合 , 然后以这个点为中心 , 向没有被收录的点 , 找最短距离( 到已经确定的点 ) , 找一个已知长度的最小长度的 边 加到 s ...

  5. POJ 1258 Agri-Net(最小生成树 Prim+Kruskal)

    题目链接: 传送门 Agri-Net Time Limit: 1000MS     Memory Limit: 10000K Description Farmer John has been elec ...

  6. 最小生成树-Prim&Kruskal

    Prim算法 算法步骤 S:当前已经在联通块中的所有点的集合 1. dist[i] = inf 2. for n 次 t<-S外离S最近的点 利用t更新S外点到S的距离 st[t] = true ...

  7. 邻接表c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    graph.c #include <stdio.h> #include <stdlib.h> #include <limits.h> #include " ...

  8. poj1861 最小生成树 prim &amp; kruskal

    // poj1861 最小生成树 prim & kruskal // // 一个水题,为的仅仅是回味一下模板.日后好有个照顾不是 #include <cstdio> #includ ...

  9. 最小生成树---Prim算法和Kruskal算法

    Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...

随机推荐

  1. form 表单跨域提交

    <!DOCTYPE html><html> <head> <title>form 表单上传文件</title> <script src ...

  2. spring mvc重定向方法

    一.不带参数,直接重定向到另一个地址: 返回String直接跳转,如: @RequestMapping(value = "/filehandle") public String u ...

  3. mongodb未授权访问漏洞

    catalogue . mongodb安装 . 未授权访问漏洞 . 漏洞修复及加固 . 自动化检测点 1. mongodb安装 apt-get install mongodb 0x1: 创建数据库目录 ...

  4. spring架构源码:

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  5. redis并发问题

    redis中的并发问题 使用redis作为缓存已经很久了,redis是以单进程的形式运行的,命令是一个接着一个执行的,一直以为不会存在并发的问题,直到今天看到相关的资料,才恍然大悟~~ 具体问题实例 ...

  6. theano .dimshuffle

    .dimshuffle 改变输入维度的顺序,返回原始变量的一个view. 输入是一个包含 $[0,1,...,ndim-1]$ 和任意数目的 $'x'$ 的组合: 例如: $('x')$:将标量变成 ...

  7. 02. Let & Const

    Let & Const let 基础用法 很简单就能说明这个问题 if(false) { var a = 'heihei' } a = undefined if(true) { var a = ...

  8. Windows常用快捷方式

    总结了其他常用的快捷方式: Ctrl+C 复制 . Ctrl+V粘贴. Ctrl+X剪切. Delete删除. Alt+Tab 应用程序切换 Ctrl+Alt+Delete  Ctrl+shift+E ...

  9. python3 安装scrapy

    twisted(网络异步框架) wget https://pypi.python.org/packages/dc/c0/a0114a6d7fa211c0904b0de931e8cafb5210ad82 ...

  10. C# 如何强制关闭WINWORD进程

    private void KillProcess(string processName) //调用方法,传参{try{ Process[] thisproc = Process.GetProcesse ...