时间限制:1000 ms | 内存限制:65535 KB难度:4
描述南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
1、把所有的楼都供上电。
2、所用电线花费最少
输入第一行是一个整数n表示有n组测试数据。(n<5)
每组测试数据的第一行是两个整数v,e.
v表示学校里楼的总个数(v<=500)
随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100)。(哪两栋楼间如果没有...
最小生成树的性质MST性质:设G = (V,E)是连通带权图,U是V的真子集。如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中,(u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,(u,v)为其中一条边。构造最小生成树,要解决以下两个问题:(1).尽可能选取权值小的边,但不能构成回路(也就是环)。(2).选取n-1条恰当的边以连接网的n个顶点。Prim算法的思想:设G = (V,E)是连通带权图,V = {1,2,…,n}。先任选一点(一般选第一个点),...
问题:给定无向图G(N,M)表明图G有N个顶点,M条边,通过Prim算法构造一个最小生成树分析:算法流程: 构造好的最小生成树就是step6运行代码:#include<cstdio>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<cctype>
#include<stack>
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define mem(a,x) m...
/* 图结构,邻接矩阵形式 */ElemType nodes[n];int edges[n][n];prim_or_dijkstra( int index, bool usePrim ) /* 起点 */{int dist[n] = { INF }; /* 从起点开始,到其他所有边的距离 */int distIndex[n] = { -1 };int visited[n] = { 0 };int selected = index; /*选中的点 *//* 初始化起点的可达边距离 */for ( i = 0; i < nodes.length; i++ )/* edges[起点][终点]=权重(不是INF就有边...
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小支撑树(minimum spanning tree)算法。给定一个无向图G,并且它的每条边均权值,则MST是一个包括G的所有顶点及边的子集的图,这个子集保证图是连通的,并且子集中所有边的权值之和为所有子集中最小的。本节中介绍三种算法求解图的最小生成树:Prim算法、Kr...
h2.western { font-family: "Liberation Sans", sans-serif; font-size: 16pt }
h2.cjk { font-size: 16pt }
h2.ctl { font-size: 16pt }
h1 { margin-bottom: 0.21cm }
h1.western { font-family: "Liberation Sans", sans-serif; font-size: 18pt }
h1.cjk { font-family: "Noto Sans CJK SC Regular"; font-size: 18pt }
h1.ctl { font-family: "Noto Sans CJK SC Regular"; font-size: 18pt }
p { margin-bottom: 0.25cm; line...
原文:算法起步之Prim算法
prim算法是另一种最小生成树算法。他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下。
prim算法的安全边是从与当前生成树相连接的边中选择一条最短的一条,并且该边是应是生成树与生成树外一点的连接。
所以我们prim算法用汉字描述的过程应为:1初始化2构造最小优先队列,将所有节点都加入到最小优先队列中,所有节点的key设置为无穷大,开...
codevs.cn 最优布线问题#include<cstdio>#include<cstring> bool u[101]; int g[101][101],minn[101]; int main(){ int n,m,q,p,total=0; scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d",&q,&p); scanf("%d",&g[q][p]); } memset(minn,0x7f,sizeof(minn)); //初始化 minn[1]=0; memset(u,1,sizeof(u)); for (int i=1;i<=n;i++) { int k=0; for (int j=1;j<=n;j++) if (u[j]&&(minn[j]<...
源代码:#include<cstdio>#include<cstring>int m,n,i[1001][1001],h[1001];bool f[1001]={0};long long ans(0);int main(){ memset(i,0x7f,sizeof(i)); memset(h,0x7f,sizeof(h)); //将数组初始化,定义为最大值,为下面查找最小值做铺垫。 h[1]=0; //从编号为1的节点开始查找。 scanf("%d%d",&n,&m); for (int a=1;a<=m;a++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); i[x][y]=i[y][x]=z; //注意这是无向图。 } for (int a=...
描述最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了!但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A、B、C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过这两条道路连通的)。输入每个测试点(输入文件...
题目来自于hihocoder点击打开链接时间限制:10000ms单点时限:1000ms内存限制:256MB
描述最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了!但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A、B、C三座城市,只需要在AB之间和BC之...
最小生成树所谓最小生成树,就是一个图的极小连通子图,它包含原图的所有顶点,并且所有边的权值之和尽可能的小。首先看看第一个例子,有下面这样一个带权图:它的最小生成树是什么样子呢?下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小:去掉那些多余的边,该图的最小生成树如下: 下面我们再来看一个更加复杂的带权图:同样道理,下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小:去掉那...
其实prim算法和dijkstra算法差不多,不过迪杰斯特拉是算从 s->t 的最短路径,而prim是算连接全图的最短路径两者都是从一个起点开始进行广搜但克鲁斯卡尔算最最小生成树是把所有边都排序好然后慢慢添加边,用并查集维护,因为用到了边的排序,所以当题目边比较多是用prim比较好,点比较多是用克鲁斯卡尔算法好点 ///prim算法 (边多的用prim)
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<st...
Prim算法:
如果N = (V。{E})是连通网,TE是N上最小生成树中边的集合。算法从U={u0}(u0属于V),TE={}開始,反复运行下述操作:在全部u属于U,v属于V-U的边(u,v)属于E中找到一条代价最小的边(u0,v0)并入集合TE,同一时候v0并入U,直至U=V为止,此时TE中必有n-1条边,则T=(V。{TE})为N的最小生成树.
为实现这个算法,需附设一个辅助数组closedge,以记录从U到V-U具有最小代价的边。对每一个顶点vi属于V-U,在辅助数组中存在一个...
之前都是看书,大部分也是c++的实现,但是搞前端不能忘了JS啊,所以JS实现一遍这两个经典的最小生成树算法。
一、权重图和最小生成树权重图:图的边带权重
最小生成树:在连通图的所有生成树中,所有边的权重和最小的生成树
本文使用的图如下:它的最小生成树如下:二、邻接矩阵邻接矩阵:用来表示图的矩阵就是邻接矩阵,其中下标表示顶点,矩阵中的值表示边的权重(或者有无边,方向等)。
本文在构建邻接矩阵时,默认Number.MAX_...