一、最小生成树问题

什么是最小生成树问题?给你一个带权连通图,需要你删去一些边,使它成为一颗权值最小的树。

二、Prim算法

1)输入:输入一个带权连通图,顶点集合V,边集合E

2)初始化:Vnew={x},x为任意一个顶点,作为起始点,Enew={},为空

3)在集合E中选择权值最小的边<u,v>,其中u为集合Vnew中的顶点,而v不在集合Vnew中但在V中,(若有多条满足条件且权值相同时,可任选其中一条)

4)将v收录集合Vnew中,将<u,v>收录Enew中

5)重复步骤4、5,直到所有的顶点都被收录到Vnew中

6)输出:输出由Vnew和Enew所描述的最小生成树

证明:

这就是一个朴素的贪心,我们只需证明这种贪心策略是正确的。先看一下这个性质:

MST性质:设G=(V,E)是一个连通网络,U是顶点集V的一个真子集。若(u,v)是G中一条“一个端点在U中(例如:u∈U),另一个端点不在U中的边(例如:v∈V-U),且(u,v)具有最小权值,则一定存在G的一棵最小生成树包括此边(u,v)。

假如通过其他途径,已经得到一颗不包含(u,v)的最小生成树,那么把(u,v)加入到这棵生成树,必定成环,由于在某点没有选(u,v),则必定可以在环上找到一个权值不小于(u,v)的边,删去此边,用(u,v)代替,仍是一颗最小生成树且总权值更小。所以由反证法知,一定存在一棵最小生成树包含(u,v)。所以可以通过每次选择符合条件的权值最小边,来得到其中一种最小生成树。

三、算法实现

思路:这里用邻接矩阵A存储图(因为Prim适合稠密图,时间复杂度一般为O(n^2)),用数组lowcost[MAXN]记录未收录顶点到Vnew的最小费用,用vis[MAXN]记录是否已收录。

1)任取一顶点s,收录到Vnew中(这里简化为vis[s] = true)

2) 初始化,将lowcost[x]初始化为到s的费用

将下列步骤进行n-1次

3)找到最小的lowcost[x]

4)若没有找到符合条件的最小lowcost[x],跳出循环

5)将x收录到Vnew

6)  更新lowcost[ ]  (因为新收录的顶点可能影响lowcost)

7)若有顶点未被收录,说明图不连通

代码:

#include<cstdio>
#include<stdbool.h>
#include<vector>
const int INF = 0x3f3f3f3f;
const int MAXN = + ;
bool vis[MAXN];
int lowcost[MAXN];
int cost[MAXN][MAXN];
//点是从0 ~ n-1
//耗费矩阵cost[][]
int Prim(int cost[][MAXN], int s, int n)
{
int ans = ;
memset(vis, false, sizeof(vis));
vis[s] = true;
for (int i = ; i < n; i++) lowcost[i] = cost[s][i];
for (int i = ; i < n; i++)
{
int minc = INF;
int pos = -;
for (int j = ; j < n; j++)
{
if (!vis[j] && lowcost[j] < minc)
{
minc = lowcost[j];
pos = j;
}
}
if (i < n - && pos < ) return -;
vis[pos] = true;
ans += minc;
for (int j = ; j < n; j++)
{
if (!vis[j] && cost[pos][j] < lowcost[j])
lowcost[j] = cost[pos][j];
}
}
return ans;
}

四、算法优化

据说可以用二叉堆、斐波那契堆等,先给自己挖一个坑,日后再补吧。

Prim算法解决最小生成树的更多相关文章

  1. HDU-1233 还是畅通工程 (prim 算法求最小生成树)

    prim 算法求最小生成树 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  2. Kruskal和Prim算法求最小生成树

    Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...

  3. 图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)

    主要参考资料:数据结构(C语言版)严蔚敏   ,http://blog.chinaunix.net/uid-25324849-id-2182922.html   代码测试通过. package 图的建 ...

  4. 【算法】prim算法(最小生成树)(与Dijkstra算法的比较)

    最小生成树: 生成树的定义:给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫做生成树.(Spanning Tree) 最小生成树的定义:在生成树的基础上,如果边上有 ...

  5. prim算法【最小生成树1】

    适用范围:要求无向图 prim算法(读者可以将其读作“普里姆算法”)用来解决最小生成树问题, 其基本思想是: ·对图G(VE)设置集合S,存放已被访问的顶点, ·然后每次从集合V-S中选择与集合S的最 ...

  6. hiho 1097 最小生成树一·Prim算法 (最小生成树)

    题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问 ...

  7. hdu 1162 Eddy&#39;s picture (Kruskal算法,prim算法,最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 [题目大意] 给你n个点的坐标,让你找到联通n个点的一种方法.保证联通的线路最短,典型的最小生成 ...

  8. 算法设计和分析(Prim算法构建最小生成树)

    问题: 给定无向图G(N,M)表明图G有N个顶点,M条边,通过Prim算法构造一个最小生成树 分析: 算法流程: 构造好的最小生成树就是step6 运行代码: #include<cstdio&g ...

  9. Prim算法求最小生成树

    首先在介绍这个算法之前我们要之明确一下什么是最小生成树的概念: 由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 ...

随机推荐

  1. Identity Server 4 原理和实战(完结)_建立Angular 客户端

    https://material.angular.io/ 第一部是安装angular cli --prefix=ac:前缀 --routing:默认使用路由 style=scss:样式使用scss - ...

  2. 在linux上部署tomcat服务

    在linux上部署tomcat 1.安装JDK 2.下载tomcat http://tomcat.apache.org/download-70.cgi 3.上传到服务器,并解压 4.上传war包或者已 ...

  3. web开发菜鸟应该如何向前端大神提问题(一次性把问题描述清楚)

    1. 问题的环境和背景这里的背景一般包括,是针对桌面浏览器还是移动端开发?如果是桌面浏览器,则兼容性要求如何?比方说,你来咨询父级是百分比高度的垂直居中效果,你就要说明,你这个效果是需要兼容IE7+还 ...

  4. [Xcode 实际操作]九、实用进阶-(19)重写父类的绘图方法,使用图形上下文绘制自定义图形

    目录:[Swift]Xcode实际操作 本文将演示如何使用图形上下文,绘制自定义图形. 使用快捷键[Command]+[N]创建一个新的类文件. (在项目文件夹[DemoApp]上点击鼠标右键[New ...

  5. C#连接Sybase数据库,Anywhere 8

    数据库版本是Adaptive Server Anywhere 8 1.添加引用,程序集 iAnywhere.Data.AsaClient.dll文件在数据库的安装目录下,例如:C:\Program F ...

  6. Java的12个语法糖【转】

    本文转载自公众号  Hollis 原创: 会反编译的 Hollis 侵权删 本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学 ...

  7. MyBatist庖丁解牛(三)

    从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个: SqlSession:作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能: Ex ...

  8. SpringBoot | Thymeleaf | 局部更新

    建立一个实体类: public class Fruit { int id; String name; public Fruit() { } public Fruit(int id, String na ...

  9. HDU 1875(最小生成树)

    #include <iostream> #include <algorithm> #include <cstdio> #include <cmath> ...

  10. Php对象及对象特性篇

    前言 以前写C++最多,大二课上学过Java.现在也差不多还给老师了.现在决定针对php重新梳理一遍,夯实基础,设计模式学起来应该会更加得心应手吧. 介绍 对象作为数据和功能代码的集合,是程序开发和代 ...