PTA 7-4 最小生成树的唯一性 (35分)
PTA 7-4 最小生成树的唯一性 (35分)
给定一个带权无向图,如果是连通图,则至少存在一棵最小生成树,有时最小生成树并不唯一。本题就要求你计算最小生成树的总权重,并且判断其是否唯一。
输入格式:
首先第一行给出两个整数:无向图中顶点数 N(≤500)和边数 M。随后 M 行,每行给出一条边的两个端点和权重,格式为“顶点1 顶点2 权重”,其中顶点从 1 到N 编号,权重为正整数。题目保证最小生成树的总权重不会超过 2^30
输出格式:
如果存在最小生成树,首先在第一行输出其总权重,第二行输出“Yes”,如果此树唯一,否则输出“No”。如果树不存在,则首先在第一行输出“No MST”,第二行输出图的连通集个数。
输入样例 1:
5 7
1 2 6
5 1 1
2 3 4
3 4 3
4 1 7
2 4 2
4 5 5
输出样例 1:
11
Yes
输入样例 2:
4 5
1 2 1
2 3 1
3 4 2
4 1 2
3 1 3
输出样例 2:
4
No
输入样例 3:
5 5
1 2 1
2 3 1
3 4 2
4 1 2
3 1 3
输出样例 3:
No MST
2
【程序思路】
用Kruskal算法创建最小生成树,如果最小生成树如果不唯一,那就说明最小生成树中的某条边可以换成其他一条同权值的边且保证仍然是最小生成树,如此只需要对最小生成树中权值不唯一的边进行删除并重新进行最小生成树的查找即可。
【程序实现】
#include<bits/stdc++.h>
using namespace std;
int n,m,c = 0,num;
struct edge {
int u,v,w;
}edg[130000];
int parent[501],tag[130000],tn,flag;
void init() {
for(int i = 1;i <= n;i ++)
parent[i] = i;
}
int getParent(int k) {
return k == parent[k] ? parent[k] : (parent[k] = getParent(parent[k]));
}
bool cmp(const edge &a,const edge &b) {
return a.w < b.w;
}
bool check() {
for(int i = 0;i < tn;i ++) {
init();
int d = 0,e = 0;
for(int j = 0;j < m;j ++) {
if(j == tag[i]) continue;
if(getParent(edg[j].u) != getParent(edg[j].v)) {
parent[getParent(edg[j].u)] = getParent(edg[j].v);
d += edg[j].w;
e ++;
}
}
if(e == n - 1 && d == c) return true;
}
return false;
}
int main() {
scanf("%d%d",&n,&m);
init();//初始化parent数组
for(int i = 0;i < m;i ++) {
scanf("%d%d%d",&edg[i].u,&edg[i].v,&edg[i].w);
}
sort(edg,edg + m,cmp);//按权重从小到大排序
for(int i = 0;i < m;i ++) {
if(getParent(edg[i].u) != getParent(edg[i].v)) {
parent[getParent(edg[i].u)] = getParent(edg[i].v);
c += edg[i].w;
if(i < m - 1 && edg[i].w == edg[i + 1].w || i && edg[i].w == edg[i - 1].w) {//有相同权重的边
flag = 1;
tag[tn ++] = i;
}
}
}
for(int i = 1;i <= n;i ++) {
if(getParent(i) == i) num ++;
}
if(num != 1) printf("No MST\n%d",num);
else printf("%d\n%s",c,!flag || !check() ? "Yes" : "No");
}
PTA 7-4 最小生成树的唯一性 (35分)的更多相关文章
- PTA 7-2 畅通工程之局部最小花费问题 (35分)
PTA 7-2 畅通工程之局部最小花费问题 (35分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出"畅通工程"的目标:使整个地区任何两个城镇间都可以实 ...
- PTA 7-1 畅通工程之局部最小花费问题(35 分)
7-1 畅通工程之局部最小花费问题(35 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的 ...
- POJ1679 The Unique MST(Kruskal)(最小生成树的唯一性)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 27141 Accepted: 9712 D ...
- PAT TOP 1005 Programming Pattern (35 分)哈希做法
1005 Programming Pattern (35 分) Programmers often have a preference among program constructs. For ex ...
- CCF(317号子任务)-35分:Dijikstra算法
317号子任务 201903-5 为了过前60分,想使用dijikstra优化算法的,但是最后还是只过了35分.这里的思路只需要先将所有的行星据点进行一次dijikstra,分别存储所有点到行星的最短 ...
- PTA 7-2 哈夫曼编码 (30分)
PTA 7-2 哈夫曼编码 (30分) 给定一段文字,如果我们统计出字母出现的频率,是可以根据哈夫曼算法给出一套编码,使得用此编码压缩原文可以得到最短的编码总长.然而哈夫曼编码并不是唯一的.例如对字符 ...
- PTA甲级1094 The Largest Generation (25分)
PTA甲级1094 The Largest Generation (25分) A family hierarchy is usually presented by a pedigree tree wh ...
- PTA 7-2 邻接表创建无向图 (20分)
PTA 7-2 邻接表创建无向图 (20分) 采用邻接表创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数. 输 ...
- PTA 6-14 用单向链表完成多项式运算(35分)
输入两个多项式,计算它们的加.减及乘法, 将计算结果输出到屏幕上. 1) 输入:从键盘分两行分别输入两个多项式数据,每个多项式输入格式如下: n a1 m1 a2 m2 a3 m3 . .. ai m ...
随机推荐
- 『Python』matplotlib共享绘图区域坐标轴
1. 共享单一绘图区域的坐标轴 有时候,我们想将多张图形放在同一个绘图区域,不想在每个绘图区域只绘制一幅图形.这时候,就可以借助共享坐标轴的方法实现在一个绘图区域绘制多幅图形的目的. import n ...
- Yaml书写方法详解
一.关于yaml语法详解 yaml通常以空格做锁进,一般是2个或者4个,如果写更多,只要格式对其 就不会报错 二.yaml基本语法规则 大小写敏感 使用锁进表示层级关系 缩紧时候不允许用tab键,只能 ...
- P4756-Added Sequence【斜率优化】
正题 题目链接:https://www.luogu.com.cn/problem/P4756 题目大意 给出序列\(a\),设\(f(l,r)=|\sum_{i=l}^ra_i|\). \(m\)次询 ...
- Python读取ini配置文件(接口自动测试必备)
前言 大家应该接触过.ini格式的配置文件.配置文件就是把一些配置相关信息提取出去来进行单独管理,如果以后有变动只需改配置文件,无需修改代码. 特别是后续做自动化的测试,代码和数据分享,进行管理.比如 ...
- Python3入门系列之-----算术运算符|比较运算符|赋值运算符|逻辑运算符|成员运算符|身份运算符
什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 1 +2 = 3 . 例子中,1 和 1.2 被称为操作数,"+" 称为运算符. Python语言支持以下类型的 ...
- 【vue】获取异步加载后的数据
异步请求的数据,对它做一些处理,需要怎么做呢?? axios 异步请求数据,得到返回的数据, 赋值给变量 info .如果要对 info 的数据做一些处理后再赋值给 hobby ,直接在 axios ...
- 从零入门 Serverless | 函数计算如何粘合云服务,提供端到端解决方案
作者 | 西流 阿里云技术专家 导读:阿里云 Serverless 产品函数计算可以作为粘合剂,串联其他云服务提供端到端解决方案,从而简化编程模型,快速实现最上层的业务目标. 传统单体应用的拆解 首先 ...
- 一文彻底搞通TCP之send & recv原理
接触过网络开发的人,大抵都知道,上层应用使用send函数发送数据,使用recv来接收数据,而send和recv的实现原理又是怎样的呢? 在前面的几篇文章中,我们有提过,TCP是个可靠的.全双工协议.其 ...
- Windows 安装 gcc
Windows 安装 gcc ① 官网下载 GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF ...
- 1.2 Simple Code!(翻译)
Simple Code! 简洁编码 Playing football is very simple, but playing simple football is the hardest thing ...