风萧萧兮易水寒,壮士要去敲代码.本女子开学后再敲了.. poj1258 Agri-Net(最小生成树)水题. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f; ; int n,m; int g[N][N],low[N]; void prim(int u0){ ; ;i<n;++i){ low[i]=g[u0][i…
还是畅通工程 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 5   Accepted Submission(s) : 3 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省…
普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 65535 typedef char VertexType; typedef int EdgeType; typedef struct { VertexType vexs[MAXVEX]; EdgeType arc[MAXVEX][MAXVEX]; int numVertexes, numEdges; }MGraph…
一.算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小.像 Kruskal算法一样,Prim算法也是贪婪算法. 二.Prim算法思想 Prim算法的思想很简单,一棵生成树意味着必须连接所有顶点.因此必须将两个不相交的顶点子集连接起来才能生成生成树 .并且它们必须以最小的权重边连接,以使其成为最小的生成树(MST).它从一棵空的生成树开始.这个…
对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成树. 其中运用到了回溯,贪心的思想. 废话少说吧,这个其实是一个模板,直接套用就好!直接上题吧!这些东西多练就好! 一.最小生成树: 题目描述 求一个连通无向图的最小生成树的代价(图边权值为正整数). 输入 第 一行是一个整数N(1<=N<=20),表示有多少个图需要计算.以下有N个图,第i图的第…
文字描述 用连通网来表示n个城市及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价.对于n个定点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网.现在,我们要选择这样一个生成树,使总的耗费最少.这个问题就是构造连通网的最小代价生成树(Minimum Cost Spanning Tree: 最小生成树)的问题.一棵生成树的代价就是树上各边的代价之和. 有多种算法可以构造最小生成树,其他多数都利用的最小生成的MST(minimum…
概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(带权图)里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(Vertex)且其所有边的权值之和最小.(注:N个顶点的图中,其最小生成树的边为N-1条,且各边之和最小.树的每一个节点(除根节点)有且只有一个前驱,所以,只有N-1条边.) 该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗伯特·普里姆(Robert C.…
概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(即"带权图")里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(Vertex)且其所有边的权值之和最小. (注:N个顶点的图中,其最小生成树的边为N-1条,且各边之和最小.树的每一个节点(除根节点)有且只有一个前驱,所以,只有N-1条边.) 该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗伯特·普里姆(…
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10765    Accepted Submission(s): 4704 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两…
描述: 一个连通图的生成树是指一个极小连通子图,它含有图中的全部顶点,但只有足以构成一棵树的 n-1 条边.我们把构造连通网的最小代价生成树成为最小生成树.而Prim算法就是构造最小生成树的一种算法. 定义: 假设N = (P,{E})是连通网,TE是N上最小生成树中边的集合.算法从U = {U0}(U0属于V).开始重复执行下述操作:在所有u属于U,v属于V-U的边(u,v)属于E中找到一条代价最小的边(u0,v0)并入集合TE,同事v0并入U,知道U = V为止.此时TE中必有n-1条边,则…
算法代码 C#代码 using System; namespace Prim { class Program { static void Main(string[] args) { int numberOfVertexes = 9, infinity = int.MaxValue; int[][] graph = new int[][] { new int[]{0, 10, infinity, infinity, infinity, 11, infinity, infinity, infinit…
//求加权无向连通图的MST的贪心算法 //最小树,最小路径联通各个点 function PRIM(){ var graph = [ [], [undefined,Infinity, 23 ,Infinity,Infinity,Infinity, 28 ,36], [undefined, 23 ,Infinity, 20 ,Infinity,Infinity,Infinity,1], [undefined,Infinity, 20 ,Infinity, 15 ,Infinity,Infinity…
题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈. 思路简介:对比普里姆和克鲁斯卡尔算法,克鲁斯卡尔算法主要针对边来展开,边数少时效率比较高,所以对于稀疏图有较大的优势:而普里姆算法对于稠密图,即边数非常多的情况下更好一些.其大致思路为在现有顶点中任意寻找一个顶点,将他作为根结点,然后在与他连接的所有边中,选择一条最短的边,同时将这条边两端的顶点…
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小.该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现:1959年,艾兹格·迪科斯彻再次发现了该算法.因此,在某些场…
我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小.综合以上两个概念,我们可以得出:构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree). 找连通图的最小生成树,经典的有两种算法,普里姆算法和克鲁斯卡尔算法,这里介绍普里姆算法. 为了能够讲明白这个算法,我们先构造网图的邻接矩阵,…
关于什么是Prim(普里姆算法)? 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经费前提 下建立这个通信网.换句话说,我们须要在这n个城市中找出一个包括全部城市的连通子图,使得 其全部边的经费之和最小. 这个问题能够转换为一个图论的问题:图中的每一个节点看成是一个城市, 节点之间的无向边表示修建该路的经费.即每条边都有其对应的权值,而我们的目标是挑选n-1条 边使全部节点保持连通…
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> //最小生成树之Prim算法 //杨鑫 #include <stdio.h> #include <stdlib.h> #define n 6 #define MaxNum 10000 /*定义一个…
最小生成树: 我们把构造连通网的最小代价生成树称为最小生成树.经典的算法有两种,普利姆算法和克鲁斯卡尔算法. 普里姆算法打印最小生成树: 先选择一个点,把该顶点的边加入数组,再按照权值最小的原则选边,选完最小权值的边,把在所选边的另一顶点的边加入数组,再选权值最小的边,如此循环(有多少顶点循环多少次) ∞ 我们代码中用65535表示 //定义邻接矩阵 let Arr2 = [ [0, 10, 65535, 65535, 65535, 11, 65535, 65535, 65535], [10,…
关于图的最小生成树算法------普里姆算法 首先我们先初始化一张图: 设置两个数据结构来分别代表我们需要存储的数据: lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说明以i为终点的边的最小权值=0,也就是表示i点加入了mst数组 mst[i]:这个数组对应的下标(图顶点)的值,是当前最小生成树表示的顶点的连接的那个边的权值 我们假设v1是初始点,进行初始化,不相连的用*表示,表示无穷大! 我们先把所有v1对应的顶点的权值放进lowcost数组中,进行初始化,之后…
MST在前面学习了Kruskal算法,还有一种算法叫做Prim的.这两者的区别是Prim算法适合稠密图,比如说鸟巢这种几乎所有点都有相连的图.其时间复杂度为O(n^2),其时间复杂度与边的数目无关:而kruskal算法的时间复杂度为O(eloge),跟边的数目有关,适合稀疏图. prim算法 基本思想:假设G=(V,E)是连通的,TE是G上最小生成树中边的集合.算法从U={u0}(u0∈V),TE={ 空集 }开始.重复执行下列操作: 1.在所有u∈U,v∈V-U的边(u,v)∈E中找一条权值最…
普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法. 基本思想 对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边. 从所有uЄU,vЄ(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边(u, v),将顶点v加入集合U中,将边(u, v)加入集合T中,如此不断重复,直到U=V为止,最小生成树构造完毕,这时集合T中包含了最小生成树中的所有边. 普里姆算法图解 以上图G4为例,…
/* 普里姆算法的主要思想: 利用二维数组把权值放入,然后找在当前顶点的最小权值,然后走过的路用一个数组来记录 */ # include <stdio.h> typedef char VertexType;//定义顶点类型 typedef int EdgeType;//定义边上的权值类型 # define MAX_VERTEX //最大顶点个数 # define INFINITY //用65535代表无穷大 typedef struct {//邻接矩阵存储结构 VertexType vexs[…
普利姆算法(prim)求最小生成树(MST)过程详解 (原网址) 1 2 3 4 5 6 7 分步阅读 生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程造价最小呢?可以把线路的造价看成权值求这几个城市的连通图的最小生成树.求最小造价的过程也就转化成求最小生成树的过程,则最小生成树表示使其造价最小的生成树. 那么怎么样用普利姆算法(prim算法)求最小生成树(MST)? 此以图例方式详述prim算法求最小生成树过程,希望对大家有帮助!   工具/原料…
c/c++ 用普利姆(prim)算法构造最小生成树 最小生成树(Minimum Cost Spanning Tree)的概念: ​ 假设要在n个城市之间建立公路,则连通n个城市只需要n-1条线路.这时,自然会考虑,如何在最节省经费的前提下建立这个公路网络. ​ 每2个城市之间都可以设置一条公路,相应地都要付出一定的经济代价.n个城市之间,最多可以设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少? 普利姆(prim)算法的大致思路: ​ 大致思想是:设图G顶点…
算法描述 lazy普利姆算法的步骤: 1.从源点s出发,遍历它的邻接表s.Adj,将所有邻接的边(crossing edges)加入优先队列Q: 2.从Q出队最轻边,将此边加入MST. 3.考察此边的两个端点,对两个端点重复第1步. 示例 从顶点0开始,遍历它的邻接表:边0-7.0-2.0-4.0-6会被加入优先队列Q. 顶点0的邻接表搜索完毕后,边0-7是最轻边,所以它会出队,并加入MST. 如下图: 边0-7出队后,开始考察边的两个端点: 顶点0已经访问过了,跳过: 顶点7还未探索,开始探索…
算法描述 在普利姆算法的lazy实现中,参考:普利姆算法的lazy实现 我们现在来考虑这样一个问题: 我们将所有的边都加入了优先队列,但事实上,我们真的需要所有的边吗? 我们再回到普利姆算法的lazy实现,看一下这个问题: 当顺着顶点0的邻接表考察顶点7时,边7-2和边7-1被加入了优先队列Q. 然而,当我们开始对顶点2进行考察时: 边2-3是最轻边,我们显然不需要对边7-2和边7-1进行再次考察. 但是,由于边7-2和边7-1在对顶点2进行考察之前已经加入了优先队列Q,似乎我们对之前发生的事无…
普里姆求解: #include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<cstdlib> #include<algorithm> #include<string> #include<stack> #include<queue> #include<map> using namespace s…
克鲁斯卡尔: function T=MST_Kruskal(G) n=0; if isfield(G,'w') && ~isempty(G.w) && size(G.w,1)==size(G.w,2) W=G.w;n=size(W,1); end if isfield(G,'e') && ~isempty(G.e) && size(G.e,2)==3 E=G.e; n=max(max(E(:,1:2)); elseif n==0 error(…
Prim算法 (哈欠)在创建最小生成树之前,让我们回忆一下什么是最小生成树.最小生成树即在一个待权值的图(即网结构)中用一个七拐八绕的折线串连起所有的点,最小嘛,顾名思义,要权值相加起来最小,你当然可以拿起笔来就算你脑中的每一种可能,但是如果你了解了这种算法,你就能跟我一样,一次画出完美答案. 上个栗子: 我先说一哈这个算法的方法论,然后我们来代码实现一下,在讲解开始之前,敲黑板,记得我们要生成一个权值最小的树,所以每一步都要考虑到树的每一个结点,不要孤立地用一个结点来对比从而走上死路,我们任选…
  图结构练习——最小生成树 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的.现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市.   输入  输入包含多组数据,格式如下. 第一行包括两个整数n m,代表城市个数和可以修建的公路个数.(n<=100) 剩下m行每行3个正整数a b c,代表城市a 和城市b…