最小代价生成树(数据结构)

 1 //最小代价生成树
 2 //prim算法(稠密图):从与这棵树相连的边中选择最短的边,并将这条边及其所连顶点接入当前树中
 3 void Prim(MGraph g,int v0,int &sum) {
 4     int lowcost[maxsize],visit[maxsize],v;//lowcost存放当前树到其他顶点的最小权值的顶点
 5     int min,k;
 6     v=v0;
 7     for(int i=0; i<g.n; i++) {
 8         lowcost[i]=g.edges[v0][i];
 9         visit[i]=0;
10     }
11     visit[v0]=1;
12     sun=0;
13     for(int i=0; i<g.n-1; i++) {
14         min=INF;//INF是比所有权值都大的整数
15         for(int j=0; j<g.n; j++) {
16             if(visit[j]==0&&lowcost[j]<min) {
17                 min=lowcost[j];
18                 k=j;
19             }
20         }
21         v=k;
22         visit[k]=0;
23         sum+=min;
24         for(int j=0; j<g->n; j++) {
25             if(visit[j]==0&&lowcost[j]>g.edges[v][j]) {
26                 lowcost[j]=g.edges[v][j];
27             }
28         }
29     }
30 }
31
32 //Kruskal算法(稀疏矩阵):每次找出候选边中权值最小的边,就将该边并入生成树中。
33 //重复此过程直到所有的边都被检测完为止
34 typedef struct Road {
35     int a,b,w;//分别表示两个顶点和路径的权值
36 };
37 Road road[maxsize];
38 int v[maxsize];//表示并查集
39 int getRoot(int a) {
40     if(a!=v[a])a=v[a];
41     return a;
42 }
43 void Kruskal(MGraph g,int &sum,Road road[]) {
44     int E,N;
45     E=g.e;
46     N=g.n;
47     for(int i=0; i<N; i++)v[i]=i;
48     sort(road,E);
49     for(int i=0; i<E; i++) {
50         int a=getRoot(road[i].a);
51         int b=getRoot(road[i].b);
52         if(a!=b) {
53             v[a]=b;
54             sum+=road[i].w;//求生成树的权值,这句并不是本算法的固定写法,也可改成其他
55         }
56     }
57 }

原文地址:https://www.cnblogs.com/aiqinger/p/12697558.html

时间: 2024-10-08 20:40:11

最小代价生成树(数据结构)的相关文章

TZOJ 5471: 数据结构实验--图的最小代价生成树

题目描述 求带权无向图的最小代价生成树. 输入 输入数据为多组,每组数据包含多行,第一行为2个整数n,e,n为图的顶点数,e为边数,接下来是e行,每行3个整数,前两个整数是一个顶点对,代表一条边所依附的两个顶点,第3个整数是边的权值. 所有值不超过20. 输出 请使用prim算法生成一棵生成树,并输出为生成树的各条边及其权值.格式见样例. 样例输入 5 71 2 11 3 12 3 42 4 22 5 13 4 54 5 6 样例输出 1 2 11 3 12 5 12 4 2 PS:太惭愧了,写

实验六 最小代价生成树

实验名称:最小代价生成树 实验章节:算法设计与分析第6章 实验目的: 掌握贪心算法解决问题的思想和一般过程,           学会使用普里姆算法解决实际问题. 提交形式: 所有作业的原程序和可执行程序(即cpp文件和exe文件) 纸质实验报告(格式和内容请参阅末页) 实验内容 完善下列程序,并回答问题. 1 #include<iostream.h> 2 3 #define G_NODE_NUM 6 //结点个数 4 5 #define INFTY 65535 6 7 template<

[数据结构] 最小(代价)生成树

在说明最小生成树之前,先重温一下其他的几个概念. 连通图:任意两个顶点都有路径相通的无向图,称为连通图.(注意不是边,而是路径) 强连通图:任意两个顶点都有路径相通的有向图,称为强连通图. 网:图的边具有一定的意义,每条边都对应着一个数据,称为权,这种图被称为网. 连通网,同理. 最小生成树 生成树:从一个连通图中拆出一棵连通子图,它包含了所有的顶点,但只保留了足以构成一棵树的边(N-1条边,N为顶点个数). 最小生成树:对于连通网而言的,所有边的代价之和最小(权的总和最小)的生成树,就是最小生

最小代价生成树

#include<iostream> using namespace std; const int Max = 100; int p[Max][Max]; const int maxCost = 99; int lowcost[Max]; int nearest[Max]; bool mark[Max]; void Prime(int k,int n) { memset(lowcost, 99, sizeof(lowcost)); memset(nearest, -1, sizeof(near

1130. 叶值的最小代价生成树

1.dp 1 int mctFromLeafValues(vector<int>& arr) { 2 int len = arr.size(); 3 vector<vector<int>> rmq(len, vector<int>(len, 0)); 4 for (int i = 0; i < len; i++) 5 rmq[i][0] = arr[i]; 6 for (int j = 1; (1<<j)<len ; j++)

kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一个环,如果还要维护处树的特点 那么就要在这个环上删去一条边,这样他还是树,删掉的边显然是这条链上权值最大边更可能形成次小生成树.那么就有2中方法可以做. 第一种PRIM在prim时候直接可以做出这个从I到J的链上权值最大的值MAX[i][j]; 同时可以用kruskal同样方式标记树边,然后DFS跑

POJ 1861 ——Network——————【最小瓶颈生成树】

Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15268   Accepted: 5987   Special Judge Description Andrew is working as system administrator and is planning to establish a new network in his company. There will be N hubs in the c

BZOJ2180: 最小直径生成树

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2180 2180: 最小直径生成树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 195  Solved: 93[Submit][Status][Discuss] Description 输入一个无向图G=(V,E),W(a,b)表示边(a,b)之间的长度,求一棵生成树T,使得T的直径最小.树的直径即树的最长链,即树上距离最远的两点之间路径

HDU5697 刷题计划 dp+最小乘积生成树

分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog.csdn.net/u013849646/article/details/51524748 注:这里用的最小乘积生成树的思想,和dp结合 每次找满足条件的最优的点,只不过BZOJ裸题的满足条件是形成一棵树 这个题是大于m,生成树借用最小生成树进行求解最优,大于m用dp进行求解最优 #include