ACM第四站————最小生成树(普里姆算法)

对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树

普里姆算法是以其中某一顶点为起点逐步寻找各个顶点上最小权值的边来构建最小生成树。

其中运用到了回溯,贪心的思想。

----------2018年5月24日补:

  #begin

    根据定义我们可知,求一个图的最小生成树的时候,一定会将所有的点都连接起来,也就是说,我们从任何一个点出发都可以得到这个图的最小生成树,那么我这里暂定从0出发,寻找到和0相连的点中最小的权值,作为连接0这一个点的边(如果有相同的最小权值,则视要求处理),将0这一个点设置为不可访问,同时保存此时的连接点,将求到的这一个点做和0一样相同的处理...处理出n个点就可以求得这个图的最小生成树了(如果不能处理出n个点,那么此图的最小生成树也就不存在)。

  #end

废话少说,直接上题吧!这些东西多练就好!

 

一、最小生成树:

题目描述
求一个连通无向图的最小生成树的代价(图边权值为正整数)。
输入
第 一行是一个整数N(1<=N<=20),表示有多少个图需要计算。以下有N个图,第i图的第一行是一个整数M(1<=M& lt;=50),表示图的顶点数,第i图的第2行至1+M行为一个M*M的二维矩阵,其元素ai,j表示图的i顶点和j顶点的连接情况,如果 ai,j=0,表示i顶点和j顶点不相连;如果ai,j>0,表示i顶点和j顶点的连接权值。
输出
每个用例,用一行输出对应图的最小生成树的代价。
样例输入
1
6
0 6 1 5 0 0
6 0 5 0 3 0
1 5 0 5 6 4
5 0 5 0 0 2
0 3 6 0 0 6
0 0 4 2 6 0
样例输出

15

//Asimple
#include <stdio.h>
#include <iostream>
#include <string.h>using namespace std;
#define INF 0xffffff
const int maxn = 55;
int G[maxn][maxn];//建图
int T, n;int prim()
{int Min, sum = 0;int adv[maxn]; //保存定点下标int lowc[maxn]; //保存权值adv[0] = lowc[0] = 0 ;//初始化for(int i=1; i<n; i++){lowc[i] = G[0][i];//先放入 第0行 的所有权值adv[i] = 0 ;}//构建过程for(int i=1; i<n; i++){Min = INF ;int j = 1 ;int k = 0 ;while( j < n ){if( lowc[j]!=0 && lowc[j]<Min){Min = lowc[j] ;k = j ;}j ++ ;}sum += G[adv[k]][k] ;//计算最小权值//printf("%d,%d",adv[k],k);//打印节点lowc[k] = 0 ;//逐行遍历接下来的k个顶点for(int l=1; l<n; l++){if( lowc[l]!=0 && G[k][l] < lowc[l] ){lowc[l] = G[k][l] ;adv[l] = k ;}}}return sum ;
}int main()
{cin >> T ;while( T -- ){cin >> n ;for(int i=0; i<n; i++)for(int j=0; j<n; j++){cin >> G[i][j];if( G[i][j] == 0 && i!=j )G[i][j] = INF ;}cout << prim() << endl ;}return 0;
}

 二、判断最小生成树是否唯一

题目描述

给出一个连通无向图,请判断其最小生成树是否是唯一的。

定义1(生成树):给出一个连通无向图G=(V,E),G的一颗生成树被标记为T=(V,E),则具有以下性质:

1)V'=V; 

2)T是连通无回路的。

定义2(最小生成树):给出一个边带权的连通无向图G=(V,E),G 的最小生成树T=(v,E)是具有最小总耗费的生成树。T的总耗费表示E' 中所有边的权值的和。

输入

第 一行给出一个整数t(1<=t<=20),表示测试用例数,每个测试用例表示一个图,测试用例的第一行给出两个整数n,m(1<=n<=100),分别表 示顶点和边的数目,后面的m行每行是一个三元组(xi,yi,wi),表示xi和yi通过权值为wi的边相连。任意两个节点间至多只有一条边相连。

输出

对于每个测试用例,如果MST是唯一的,输出其总耗费;否则输出字符串'Not Unique!'. 

样例输入
2
3 3
1 2 1
2 3 2
3 1 3
4 4
1 2 2
2 3 2
3 4 2
4 1 2
样例输出

3

Not Unique!

 

#include <stdio.h>
#include <iostream>
#include <string.h>using namespace std;
#define INF 0xffffff
const int maxn = 55;
int G[maxn][maxn];//建图
int T, n, m, x, y, num;void prim()
{int Min, sum = 0;int adv[maxn]; //保存定点下标int lowc[maxn]; //保存权值bool flag = false ;adv[0] = lowc[0] = 0 ;//初始化for(int i=1; i<n; i++){lowc[i] = G[0][i];//先放入 第0行 的所有权值adv[i] = 0 ;}//构建过程for(int i=1; i<n; i++){Min = INF ;int j = 1 ;int k = 0 ;while( j < n ){if( lowc[j]!=0 && lowc[j]<=Min){if( lowc[j] == Min ) flag = true ;Min = lowc[j] ;k = j ;}j ++ ;}sum += G[adv[k]][k] ;//计算最小权值lowc[k] = 0 ;//逐行遍历接下来的k个顶点for(int l=1; l<n; l++){if( lowc[l]!=0 && G[k][l] < lowc[l] ){lowc[l] = G[k][l] ;adv[l] = k ;}}}if( flag ) cout << "Not Unique!" << endl ;else cout << sum << endl ;
}int main()
{cin >> T ;while( T -- ){cin >> n >> m ;for(int i=0; i<n; i++)for(int j=0; j<n; j++){if( i == j ) G[i][j] = 0 ;else G[i][j] = INF ;}for(int i=0; i<m; i++){cin >> x >> y >> num ;G[x-1][y-1] = num ;G[y-1][x-1] = num ;}prim();}return 0;
}

2018年4月1日更正:

上面的代码过不了  POJ 1679。谢谢指点~~   今天更改了下自己的程序。

18390068Asimple1679Accepted312K16MSC++1483B2018-04-01 20:08:48
//Asimple
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
#define INF 0xffffff
typedef long long ll ;
const int maxn = 100+5;
int n, T, num, cnt, x, y, t, m, w;
int Map[maxn][maxn];void prim() {int lowc[maxn];for(int i=1; i<=n; i++) lowc[i] = Map[1][i];int sum = 0;bool flag = false;for(int l=1; l<n; l++) {int Min = INF;int k = 0;for(int j=2; j<=n; j++) {if( lowc[j]!=0 && Min > lowc[j] ) {k = j;Min = lowc[j];}}if( Min == INF ) break; sum += Min;int cnt = 0;for(int i=1; i<=n; i++)if( Map[k][i] == lowc[k] )cnt ++;if( cnt > 1 ) {flag = true;break;}lowc[k] = 0;for(int i=2; i<=n; i++) {if( lowc[i] > Map[k][i] ) {lowc[i] = Map[k][i];}}}if( flag ) cout << "Not Unique!" << endl;else cout << sum << endl;
}void input() {ios_base::sync_with_stdio(false);cin >> T;while( T -- ) {cin >> n >> m;for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) {Map[i][j] = i==j?0:INF;}}while( m -- ) {cin >> x >> y >> w;Map[x][y] = min(Map[x][y], w);Map[y][x] = Map[x][y];}prim();} 
}int main() {input();return 0;
}

 

转载于:https://www.cnblogs.com/Asimple/p/5551129.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用jenkins的api来完成相关工作流程的自动化

[本文出自天外归云的博客园] 背景 1. 实际工作中涉及到安卓客户端方面的测试&#xff0c;外推或运营部门经常会有很多的渠道&#xff0c;而每个渠道都对应着一个app的下载包&#xff0c;这些渠道都记录在安卓项目下的一个渠道列表文件中。外推或运营部门经常会有新的渠道产生&a…

拥有成本分析:Oracle WebLogic Server与JBoss

Crimson Consulting Group 撰写的非常有趣的白皮书 &#xff0c;比较了Weblogic和JBoss之间的拥有成本 。 尽管JBoss是免费的&#xff0c;但该白皮书却严肃地宣称&#xff0c;从长远来看&#xff0c;Weblogic更便宜。 尽管此研究是由Oracle赞助的&#xff0c;但它看起来非常严肃…

mysql limit 分页 0_Mysql分页之limit用法与limit优化

Mysql limit分页语句用法与Oracle和MS SqlServer相比&#xff0c;mysql的分页方法简单的让人想哭。--语法&#xff1a;SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset--举例&#xff1a;select * from table limit 5; --返回前5行select * from table limit 0…

与硒的集成测试

总览 我已经使用了一段时间&#xff0c;遇到了一些似乎可以使生活更轻松的事情。 我以为可以将其作为教程分享&#xff0c;所以我将向您介绍这些部分&#xff1a; 使用Maven设置Web项目&#xff0c;配置Selenium以在CI上作为集成测试运行 寻找使用“页面对象”为网站中的页面…

linux每天一小步---sed命令详解

1 命令功能 sed是一个相当强大的文件处理编辑工具&#xff0c;sed用来替换&#xff0c;删除&#xff0c;更新文件中的内容。sed以文本行为单位进行处理&#xff0c;一次处理一行内容。首先sed吧当前处理的行存储在临时的缓冲区中&#xff08;称为模式空间pattern space&#xf…

mysql trace工具_100% 展示 MySQL 语句执行的神器-Optimizer Trace

在上一篇文章《用Explain 命令分析 MySQL 的 SQL 执行》中&#xff0c;我们讲解了 Explain 命令的详细使用。但是它只能展示 SQL 语句的执行计划&#xff0c;无法展示为什么一些其他的执行计划未被选择&#xff0c;比如说明明有索引&#xff0c;但是为什么查询时未使用索引等。…

MOXy作为您的JAX-RS JSON提供程序–服务器端

在以前的系列文章中&#xff0c;我介绍了如何利用EclipseLink JAXB&#xff08;MOXy&#xff09;创建RESTful数据访问服务。 在本文中&#xff0c;我将介绍在服务器端利用MOXy的新JSON绑定添加对基于JAXB映射的JSON消息的支持有多么容易。 MOXy作为您的JAX-RS JSON提供程序–服…

006_过滤器

过滤器 过滤器&#xff08;Filter&#xff09;把附加逻辑注入到MVC框的请求处理&#xff0c;实现了交叉关注。所谓交叉关注&#xff08;Cross-Cutting Concerns&#xff09;&#xff0c;是指可以用于整个应用程序&#xff0c;而又不适合放置在某个局部位置的功能&#xff0c;否…

Android_项目文件结构目录分析

android项目文件结构目录分析 在此我们新建了一个helloworld的项目&#xff0c;先看一些目录结构&#xff1a; 这么多的文件夹和文件中&#xff0c;我们重点关注是res目录、src目录、AndroidManifest.xml文件&#xff1a; 一、res目录主要是用来存放android项目的各种资源文件&…

实体 联系 模型mysql_数据库系统概念读书笔记――实体-联系模型_MySQL

bitsCN.com数据库系统概念读书笔记——实体-联系模型前言为了重新回顾我写的消息系统架构&#xff0c;我需要重新读一下数据库系统概念的前三章&#xff0c;这里简单的做一个笔记&#xff0c;方便自己回顾基本概念实体-联系(E-R)数据模型基于对现实世界的这样一种认识&#xff…

使用Twitter Bootstrap,WebSocket,Akka和OpenLayers玩(2.0)

原始帖子可以在ekito网站上找到。 对于我们的一位客户&#xff0c;我们需要显示一张具有实时更新的车辆位置的地图。 因此&#xff0c;我开始使用Play制作原型&#xff01; 框架及其最新发布的版本2.0&#xff0c;使用Java API。 我从Play的网络聊天室开始&#xff01; 2.0个样…

同步时间

同步时间 [rootlocalhost 03]# ntpdate 0.centos.pool.ntp.org 转载于:https://www.cnblogs.com/cglWorkBook/p/5556920.html

mysql 5.6.23免安装_mysql5.6.23免安装配置

1.官网下载&#xff0c;并解压2.环境变量&#xff0c;path下&#xff0c;追加mysql的bin路径D:\Program Files\mysql\bin;3.mysql目录下的my-default.ini重命名为my.ini&#xff0c;并添加下面的代码basedirD:/Program Files/mysql #mysql路径datadirD:/Program Files/mysql/d…

在Intellij IDEA中运行Vaadin应用

在本文中&#xff0c;我将向您展示如何使用Intellij IDEA运行vaadin应用程序。 Vaadin提供了一些用于Eclipse和Netbeans的插件。 但是对于Intellij IDEA来说&#xff0c;还没有插件。 但是部署vaadin应用程序比其他两个IDE容易。 这是您要遵循的步骤。 1.首先创建一个新项目&am…

mysql主从数据库

Mysql主从配置&#xff0c;实现读写分离 大型网站为了软解大量的并发访问&#xff0c;除了在网站实现分布式负载均衡&#xff0c;远远不够。到了数据业务层、数据访问层&#xff0c;如果还是传统的数据结构&#xff0c;或者只是单单靠一台服务器扛&#xff0c;如此多的数据库连…

安装openstack时遇到的错误

学习opensatck的第一步是安装DevStack来进行本机操作 1. 下面命令没有权限&#xff0c;解决办法&#xff1a;切换到root用户下执行sudo -s echo "stack ALL(ALL) NOPASSWD: ALL" >> /etc/sudoers2. 执行下面命令提示没有git&#xff0c;解决办法&#xff1a;su…

Java EE 6示例– Galleria –第3部分

关于Galleria示例的先前文章&#xff08; 第1 部分 | 第2部分 | 第3部分 | 第4部分 &#xff09;指导您完成基础知识以及对GlassFish和WebLogic的初始部署。 从今天开始&#xff0c;我尝试在其中添加一些企业级功能&#xff0c;因为我发现他们在自己的项目中提出了很多要求。 我…

在 Windows 上测试 Redis Cluster的集群填坑笔记

redis 集群实现的原理请参考http://www.tuicool.com/articles/VvIZje集群环境至少需要3个节点。推荐使用6个节点配置&#xff0c;即3个主节点&#xff0c;3个从节点。新建6个文件夹 分别是 7000/7001/7002/7003/7004/7005将redis.windows.conf 复制一份然后修改配置文件中的下面…

不成为编程天才的5种贡献方式

安迪莱斯特&#xff08;Andy Lester&#xff09;早在三月发布了原始指南&#xff0c;其中介绍了14种不成为编程天才或摇滚明星的贡献开源的方法 &#xff0c;我真的很喜欢这个想法。 这就是为什么我决定稍微采纳一下这篇文章&#xff0c;并告诉您如何以及可以做什么来支持自己喜…