算法设计和分析(Prim算法构建最小生成树)
问题:
给定无向图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) memset(a,x,sizeof(a))
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid + 1,r
#define P pair<int,int>
#define ull unsigned long long
using namespace std;
typedef long long ll;
const int maxn = ;
const ll mod = ;
const int inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-; int n, m; // 假设有n个点,m条边
int edge[maxn][maxn]; // 用邻接矩阵来存图
int vis[maxn]; // 记录某点是否加入最小生成树中
int dist[maxn]; // 记录最小生成树中每一个点邻接的最短边
int father[maxn]; // 记录某点的父亲节点,记录构成最小生成树的边
int main()
{ scanf("%d %d", &n, &m);
memset(edge, inf, sizeof edge); // 将临界矩阵初始化为inf ,edge[u][v] == inf 代表u和v不连通
for (int i = ; i <= n; ++i) // 将数据进行初始化
{
vis[i] = false;
father[i] = -;
dist[i] = inf;
edge[i][i] = ;
}
for (int i = ; i <= m; ++i)
{
int u, v,val;
scanf("%d %d %d", &u, &v,&val); // 获取边的起点、终点和权值
edge[u][v] = min(val , edge[u][v]);
edge[v][u] = min(val , edge[v][u]); // 用邻接矩阵存图 , 对于起点和终点相同的边仅保留最小值即可
}
vis[] = true; // 将1号点添加进最小生成树中,作为树根
for (int i = ; i <= n; ++i)
{
dist[i] = edge[][i];
father[i] = ;
}
father[] = -; // 将树根的父亲节点设为-1
for (int i = ; i <= n; ++i)
{
int v = -;
int tmp = inf;
for (int j = ; j <= n; ++j) // 在最小生成树之外寻找最短路径
{
if (!vis[j] && dist[j] < tmp)
{
v = j;
tmp = dist[j];
}
}
vis[v] = true; // 将寻找到的最短路径的终点加入最小生成树中
for (int j = ; j <= n; ++j)
{
if (!vis[j] && edge[v][j] < dist[j]) // 在有新的点加入最小生成树之后,要更新dist中的值
{
dist[j] = edge[v][j];
father[j] = v;
}
}
}
int sum = ;
for (int i = ; i <= n; ++i) sum += dist[i]; //输出最小生成树的权值和,以及构成最小生成树的边
printf("最小生成树的权值是:%d\n", sum);
printf("构成最小生成树的边为:\n");
for (int i = ; i <= n; ++i)
{
if (father[i] != -)
{
printf("%d %d\n", father[i], i);
}
}
return ;
} /*
6 9
1 5 1
1 6 2
1 2 3
2 6 4
2 3 5
3 6 6
3 4 7
4 6 8
4 5 9 样例 */
Prim
算法设计和分析(Prim算法构建最小生成树)的更多相关文章
- 『嗨威说』算法设计与分析 - 贪心算法思想小结(HDU 2088 Box of Bricks)
本文索引目录: 一.贪心算法的基本思想以及个人理解 二.汽车加油问题的贪心选择性质 三.一道贪心算法题点拨升华贪心思想 四.结对编程情况 一.贪心算法的基本思想以及个人理解: 1.1 基本概念: 首先 ...
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划
由于种种原因(看这一章间隔的时间太长,弄不清动态规划.分治.递归是什么关系),导致这章内容看了三遍才基本看懂动态规划是什么.动态规划适合解决可分阶段的组合优化问题,但它又不同于贪心算法,动态规划所解决 ...
- 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)
PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...
- 算法设计与分析 - AC 题目 - 第 2 弹
PTA-算法设计与分析-AC原题7-1 最大子列和问题 (20分)给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 ...
- 算法设计与分析-Week12
题目描述 You are given coins of different denominations and a total amount of money amount. Write a func ...
- 算法设计与分析基础 (Anany Levitin 著)
第1章 绪论 1.1 什么是算法 1.2 算法问题求解基础 1.2.1 理解问题 1.2.2 了解计算设备的性能 1.2.3 在精确解法和近似解法之间做出选择 1.2.4 算法的设计技术 1.2.5 ...
- 南大算法设计与分析课程复习笔记(1) L1 - Model of computation
一.计算模型 1.1 定义: 我们在思考和处理算法的时候是机器无关.实现语言无关的.所有的算法运行在一种“抽象的机器”之上,这就是计算模型. 1.2 种类 图灵机是最有名的计算模型,本课使用更简单更合 ...
- 算法设计与分析(李春保)练习题答案v1
1.1第1 章─概论 1.1.1练习题 1.下列关于算法的说法中正确的有(). Ⅰ.求解某一类问题的算法是唯一的 Ⅱ.算法必须在有限步操作之后停止 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模 ...
- 算法设计与分析 - 李春葆 - 第二版 - pdf->word v3
1.1 第1章─概论 练习题 . 下列关于算法的说法中正确的有( ). Ⅰ.求解某一类问题的算法是唯一的 Ⅱ.算法必须在有限步操作之后停止 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊 Ⅳ. ...
随机推荐
- USACO[19-20]Dec银组题解
1,MooBuzz 这题其实是道数学题. 我们先找找符合要求的数:1,2,4,7,8,11,13,14…… 我们发现再往后找都是这8个数中的一个加15k如:16……19……29…… 找规律发现k=n/ ...
- 12541:TNS无监听状态
上次在项目上遇见数据库报这个问题,然后网上几乎都是让重新进行配置数据库.配置多次之后还是无效,最后找到了问题的根源. 使用的是Oracle数据库,用PLSQL登录报的这个错误. 在计算机全局搜索:li ...
- 文本情感分析(二):基于word2vec、glove和fasttext词向量的文本表示
上一篇博客用词袋模型,包括词频矩阵.Tf-Idf矩阵.LSA和n-gram构造文本特征,做了Kaggle上的电影评论情感分类题. 这篇博客还是关于文本特征工程的,用词嵌入的方法来构造文本特征,也就是用 ...
- Hibernate(十)--spring整合hibernate
结构: Spring和Hibernate整合借助于HibernateTemplate applicationContext.xml <?xml version="1.0" e ...
- DStream-04 Window函数的原理和源码
DStream 中 window 函数有两种,一种是普通 WindowedDStream,另外一种是针对 window聚合 优化的 ReducedWindowedDStream. Demo objec ...
- Q 格式使用总结
注意 16位有符号数 表示的范围是 -32768~32767 假如 整形数在内存中以源码的形式存放, 则0000 0000 0000 0000 表示正整数0 则 1000 0000 0000 0000 ...
- python——字符输出ASCII码
总是忘记事,赶紧记下来,Python字符转成ASCII需要用到一个函数ord # 用户输入字符 ch = input("请输入一个字符: ") # 用户输入ASCII码,并将输入的 ...
- [ cocos2d-JS ] 创建项目命令
cocos new HelloJS -l js -p com.neworigin.HelloJS -d D:\0-Game\cocosJS-project
- NOIP2016天天爱跑步解题思路
算法:LCA,树上差分+(乱搞) 如果有写错的地方请大佬更正 对于100%数据: u表示起点,v表示终点 对于一条u到v的路径,先讨论LCA!=u&&LCA!=v的情况: 分为u到LC ...
- Oracle rownum用法、分页
转载:ORACLE 中ROWNUM用法总结! 第一部分 1.对于 Oracle 的 rownum 问题,很多资料都说不支持 >, >= , =, between...and ,只能用 ...