最小生成树之prim

prim是设置一个初始结点,寻找其周围最小的边权值,并将该结点作为初始结点,继续寻找现在结点周围的边权值的最小值,但要注意如果这次寻找的某个边权值没有上次的小的话仍然保留上一次的边权值,即lowcast的值将会不变。

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<algorithm>
 5 using namespace std;
 6 const int inf=0x3f3f3f3f;///当两个点之间没有边时设置这两个边之间的距离为无穷大
 7 const int maxn=110;///数组的长度
 8 int ma[maxn][maxn],lowcost[maxn];///ma[i][j]数组的用于存储i,j两点之间的距离,lowcast[j]用于存储从标记边k到边j的边的长度
 9 bool vis[maxn];///用于记录点是否已经加入到树中
10 int nodenum,sum;
11 void prim()
12 {
13 int temp,k;
14 sum=0;
15 memset(vis,false,sizeof(vis));
16 vis[1]=true;///从1开始查询
17 for(int i=1;i<=nodenum;i++)
18 {
19 lowcost[i]=ma[1][i];
20
21 }
22 for(int i=1;i<=nodenum;i++){
23 temp=inf;///temp用于存储最短的距离
24 for(int j=1;j<=nodenum;j++){
25 if(!vis[j]&&temp>lowcost[j])
26 temp=lowcost[k=j];///在赋值的同时把j的值赋给k,下次就从k开始向其他结点寻找
27 if(temp==inf)break;///如果temp值没有改变的话就证明该点不与其它点连通,最小生成树建立失败,跳出循环
28 vis[k]=true;
29 sum+=temp;
30 for(int j=1;j<=nodenum;j++){
31 if(!vis[j]&&lowcost[j]>ma[k][j])///此时lowcast中其实还含有上一个结点到j的距离,若ma[k][j]不足够小的话lowcast的值将不变
32 lowcost[j]=ma[k][j];
33 }
34 }
35 }
36
37 }
38 int main()
39 {
40 int a,b,cost,edgenum;
41 while(cin>>nodenum&&nodenum){
42 memset(ma,inf,sizeof(ma));///初始化最开始所有的点之间都不关联
43 edgenum=nodenum*(nodenum-1)/2;///edgenum是所有点之间都有边相连的边的个数
44 for(int i=1;i<=edgenum;i++){
45 cin>>a>>b>>cost;
46 if(cost<ma[a][b]){
47 ma[a][b]=ma[b][a]=cost;///无向图的边没有方向
48 }
49 }
50 prim();
51 cout<<sum<<endl;
52 }
53 }

时间: 2024-10-05 05:04:47

最小生成树之prim的相关文章

最小生成树(prim算法,Kruskal算法)c++实现

1.生成树的概念 连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树. 生成树是连通图的极小连通子图.所谓极小是指:若在树中任意增加一条边,则将出现一个回路:若去掉一条边,将会使之变成非连通图. 生成树各边的权值总和称为生成树的权.权最小的生成树称为最小生成树. 2.最小生成树的性质用哲学的观点来说,每个事物都有自己特有的性质,那么图的最小生成树也是不例外的.按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点.n-1 条边. 3.构造最小生成树,要解决以下两个问题

最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)

最小生成树的性质 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}.先任选一点(一般选第一个点),首

最小生成树之Prim算法

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,在辅助数组中存在一个相应分量clos

hihoCoder #1097 最小生成树之Prim算法

原题网址,http://hihocoder.com/problemset/problem/1097 #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但 是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就 可以使得任意两座城市都可以通过所建

最小生成树:prim算法和kruskal算法

一个连通图的生成树是图的极小连通子图.它包含图中的所有顶点,并且只含尽可能少的边.若砍去它的一条边,就会使生成树变成非连通图:若给它增加一条边,则会形成一条回路. 最小生成树有如下性质: 1.最小生成树非唯一,可能有多个最小生成树: 2.最小生成树的边的权值之和总唯一,而且是最小的: 3.最小生成树的边数为顶点数减1. 构造最小生成树可以有多种算法.其中多数算法利用了最小生成树的下列一种简称为MST的性质: 假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集.若(u, v)是一条具有

数据结构之---C语言实现最小生成树之prim(普里姆)算法

//最小生成树之Prim算法 //杨鑫 #include <stdio.h> #include <stdlib.h> #define n 6 #define MaxNum 10000 /*定义一个最大整数*/ /*定义邻接矩阵类型*/ typedef int adjmatrix[n + 1][n + 1]; /*0号单元没用*/ typedef struct { int fromvex, tovex; //生成树的起点和终点 int weight; //边的权重 }Edge; ty

hdu1301&amp;poj1251 Jungle Roads(最小生成树之prim果题)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1301 POJ: http://poj.org/problem?id=1251 一道prim算法的果题! 题目很长,这里就不贴题目了. 题意: 给你每个村庄之间的维护道路的费用,求最小的费用. 代码如下: #include <cstdio> #include <cstring> #include &

Hihocoder 之 #1097 : 最小生成树一&#183;Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)

#1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A.B.C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过

hihoCoder - hiho一下 第二十六周 - A - 最小生成树一&#183;Prim算法

题目1 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来--小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A.B.C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过这两

无向带权图的最小生成树算法——Prim及Kruskal算法思路

边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以把边上的权值解释为线路的造价.则最小生成树表示使其造价最小的生成树. 构造网的最小生成树必须解决下面两个问题: 1.尽可能选取权值小的边,但不能构成回路: 2.选取n-1条恰当的边以连通n个顶点: MST性质:假设G=(V,E)是一个连通网,U是顶点V的一个非空子集.若(u,v)是一条具有最小权值的