关于Prime算法的从入门到升天的讲解

摘要:
说到最小(大)生成树的典型算法当然是Prime和Kruskal了。这里主要是谈一谈Prime算法。Prime算法的核心步骤:在带权连通图中假设V是包含所有顶点的集合,U是已经在最小生成树中的节点的集合,从图中任意某一顶点v开始,此时集合U={v}。树的一大核心思想就是可以把问题下移到子树上从而达到简化,细化问题的目的。

说到最小(大)生成树的典型算法当然是Prime和Kruskal了。
Kruskal比较好理解就不说了。这里主要是谈一谈Prime算法。

Prime算法的核心步骤:
在带权连通图中假设V是包含所有顶点的集合, U是已经在最小生成树中的节点的集合,从图中任意某一顶点v开始,此时集合U={v}。
重复执行下述操作:
在所有u∈U,w∈V-U的边(u,w)∈E中找到一条权值最小的边,将(u,w)这条边加入到已找到边的集合,并且将点w加入到集合U中,当U=V时,就找到了这颗最小生成树。

这样讲可能对新人来说比较难理解。我们可以这样想:
首先最小生成树他是一颗“树”。树的一大核心思想就是可以把问题下移到子树上从而达到简化,细化问题的目的。那么一颗树最小的问题就变成了他的最小子树加一条权值最小的边的问题。
那么那条最小的边是哪条呢?我们可以这样想,我们最后的目的是把所有点连成一颗树同时使树的权值和最小,那么我们根本不关心新的点会连到树的哪个点上,只要边权值小就行。那么我们可以把已有的树(集合U)看成一个“点”,只需要不断更新这个“点”到其他边的权值,然后每次从其中选一个最小的连上就行。

来看道例题:

Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He needs your help, of course.
Farmer John ordered a high speed connection for his farm and is going to share his connectivity with the other farmers. To minimize cost, he wants to lay the minimum amount of optical fiber to connect his farm to all the other farms.
Given a list of how much fiber it takes to connect each pair of farms, you must find the minimum amount of fiber needed to connect them all together. Each farm must connect to some other farm such that a packet can flow from any one farm to any other farm.
The distance between any two farms will not exceed 100,000.

题意懒的看的无所谓,大致就是告诉你有多少个点,然后给你这些点间的距离,让你用最短的距离把所有点连起来。

Input

The input includes several cases. For each case, the first line contains the number of farms, N (3 <= N <= 100). The following lines contain the N x N conectivity matrix, where each element shows the distance from on farm to another. Logically, they are N lines of N space-separated integers. Physically, they are limited in length to 80 characters, so some lines continue onto others. Of course, the diagonal will be 0, since the distance from farm i to itself is not interesting for this problem. 

Output

For each case, output a single integer length that is the sum of the minimum length of fiber required to connect the entire set of farms. 

Sample Input

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

Sample Output

28

这里我们只用这道题的背景,不讲这道题(也不是啥难题,就是prime入门题)。
如果想看这道题的详细代码请点击这里:http://blog.csdn.net/vocaloid01/article/details/78723779

关键是看Prime实现部分:

#define INF 0x3f3f3f3f

int N;
int map[105][105];

bool book[105];//true为已经加入树的,false则相反 
int lenth[105];//注意有的博客这里解释为根到各个点的距离,其实应该是“树”到各个点的距离 
int Prime()
{
    memset(book,false,sizeof(book));
    int sum = 0;
    book[0] = true;//这里选0点为根 
    for(int i=1 ; i<N ; i++)
    {
        lenth[i] = map[0][i];//刚开始集合就是0点 
    }

    for(int i=1 ; i<N ; i++)
    {
        int min = INF;
        int node;
        for(int j=1 ; j<N ; j++)//选出与“树”相连且权值最小的边 
        {
            if(book[j] == false && lenth[j]<min)
            {
                min = lenth[j];
                node = j;
            }
        }
        sum += min;
        book[node] = true;//把新的点加入树中 
        for(int i=1 ; i<N ; i++)//根据新加入的点更新“树”到其他点的距离。 
        {
            if(book[i] == false && lenth[i]>map[node][i])
            {
                lenth[i] = map[node][i];
            }
        }
    }
    return sum;//返回结果 
}

由于PS用的比较差(就是懒(:з」∠))就没画图了,希望能帮到初学者吧。
另外有啥不对的地方也欢迎指正。至于推荐题吧。。。。就上面那一道就不错,
嗯嗯嗯~(NO B 数 in my heart)

免责声明:文章转载自《关于Prime算法的从入门到升天的讲解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇页面回到顶部的效果linux虚拟机环境快速搭建redis5.x版本的主从集群总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

ABB机器人功能程序(FUNC)

功能程序的应用范围非常广泛。熟练的人员可以根据不同的需求创建相应的功能程序。函数程序的固定格式是FUNC,返回结束。在ABB的学习中,许多学生对功能程序几乎一无所知,即使他们真的在使用它。在学习ABB的过程中,我遇到了几个用例,所以我总结了它们以加深我的理解。...

【工具技巧】:sublime notepad++ 多行编辑

将光标定位到一行-˃ctrl+shift+↑↓, 上下移动一行。选择-˃ctrl+shift后+↑↓, 上下移动所选区域。再次按6:Ctrl+Shift+Enter在光标前插入一行。...

部署springboot+vue项目文档(若依ruoyi项目部署步骤)

1: 部署Linux+nginx部署背景代码1.1因为我使用了idea工具进行开发,所以终端中的mvnclean包生成了相应的jar包。这个jar包可以在相应文件所在目录的目标中找到。linux服务器需要加载redis和nginx。redis存储缓存数据,nginx用于代理前端和后端服务。打包vue项目并将dist文件复制到tomcat的webapps目录中...

Activiti-个人任务

1.分配任务所有者1.1固定分配在业务流程建模期间指定固定任务所有者;在properties视图中,填写Assignee项作为任务所有者;注:通过固定分配方法,任务是逐步执行的,任务负责人将根据bpmn的配置分配给每个任务;1.2表达式分配1.2.1 UEL表达式Activiti使用UEL表达式,UEL是javaEE6...

ArchLinux安装英伟达显卡驱动

Optimus manager qt Install novausudopacman-Sxf86-video novau右键单击导航栏上的Intel图标,选择列表中的设置功能,单击左侧的Optimus,然后在右侧窗口中选择nouveau作为切换方法。右键单击导航栏上的Intel图标以选择要使用的图形卡类型。在我选择Nvidia显卡后,您需要注销并再次登录才能...

TensorRT在ubuntu18.04的安装

安装TensorRT前需要安装Cuda和cudnn,安装步骤可以参考ubuntu安装cuda和cudnn。...