poj1679 The Unique MST(最小生成树唯一性)
最小生成树的唯一性,部分参考了oi-wiki
如果一条不在最小生成树边集内的边,它可以替换一条在最小生成树边集内,且权值相等的边,那么最小生成树不是唯一的
同过kruskal来判断
考虑权值相等的边,记录有几条边是目前可以被选入的,和实际选入了几条边,如果不相同,则最小生成树不唯一
原因是如果出现这两个值不相等的情况,则一定出现了环,且这个环内至少有两条边权值相同
具体实现,用一个\(\text{tail}\)指针指向当前权值的最后一条边,当\(\text{i}>\text{tail}\)(也就是当前边权的边全部被考虑完)的时候,就去判断上述的两个值是否相等
注意kruskal循环的时候要循环到\(m+1\),这样如果权值最大的一部分边要被选到的话,会在\(i=m+1\)的时候进行判断
而且在判断当前选的边数已经等于\(n-1\),不能直接跳出,要等到\(\text{i}>\text{tail}\)判断那两个值是否相等,如果相等再跳出,否则也是不唯一
当然网上也有那种每次删边跑kruskal的做法,但复杂度明显没有这个优秀
模板题
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n,m;
struct data{
int from,to,w;
}e[10006];
int fa[10006];
inline int cmp(data aa,data aaa){return aa.w<aaa.w;}
inline int find(int k){return k==fa[k]?k:fa[k]=find(fa[k]);}
int main(){int t=read();while(t--){
n=read();m=read();
for(reg int i=1;i<=n;i++) fa[i]=i;
for(reg int i=1;i<=m;i++){
e[i].from=read();e[i].to=read();e[i].w=read();
}
std::sort(e+1,e+1+m,cmp);
int ans=0,cnt=1,tail=0;
int choose=0,sum=0;
for(reg int i=1;i<=m+1;i++){
if(i>tail){
// std::printf("%d %d\n",choose,sum);
if(choose!=sum) goto NOT;
if(cnt>=n) break;
sum=choose=0;
for(tail++;e[tail].w==e[i].w&&tail<=m;tail++)
if(find(e[tail].from)!=find(e[tail].to)) sum++;//如果这条边目前能被加进去,sum才+1
tail--;
}
int from=find(e[i].from),to=find(e[i].to);
if(from==to) continue;
cnt++;fa[from]=to;
if(cnt<=n) ans+=e[i].w,choose++;;
}
std::printf("%d\n",ans);continue;
NOT:;std::puts("Not Unique!");
}
return 0;
}
poj1679 The Unique MST(最小生成树唯一性)的更多相关文章
- [poj1679]The Unique MST(最小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28207 Accepted: 10073 ...
- POJ1679 The Unique MST(Kruskal)(最小生成树的唯一性)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 27141 Accepted: 9712 D ...
- POJ-1679 The Unique MST(次小生成树、判断最小生成树是否唯一)
http://poj.org/problem?id=1679 Description Given a connected undirected graph, tell if its minimum s ...
- POJ1679 The Unique MST[次小生成树]
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28673 Accepted: 10239 ...
- POJ1679 The Unique MST 【次小生成树】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20421 Accepted: 7183 D ...
- POJ1679 The Unique MST 2017-04-15 23:34 29人阅读 评论(0) 收藏
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29902 Accepted: 10697 ...
- POJ1679 The Unique MST —— 次小生成树
题目链接:http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total S ...
- POJ-1679 The Unique MST,次小生成树模板题
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Description Given a connected undirec ...
- poj1679 The Unique MST(判定次小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23180 Accepted: 8235 D ...
- POJ-1679.The Unique MST.(Prim求次小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39561 Accepted: 14444 ...
随机推荐
- alg-查找只出现一次的数
//只有2个数出现1次,其余的数都出现2次 class Solution { public: vector<int> singleNumber(const vector<int> ...
- 数据结构和算法(Golang实现)(20)排序算法-选择排序
选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次.虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟 ...
- AJ学IOS(04)UI之半小时搞定Tom猫
AJ分享 必须精品 效果图 曾经风靡一时的tom猫其实制作起来那是叫一个相当的easy啊 功能全部实现,(关键是素材,没有素材的可以加我微信) 新手也可以很快的完成tom这个很拉轰的ios应用哦 然 ...
- d3限制范围缩放和平移升级到版本4
感谢您提供帮助以更新下面的代码以在版本4中工作.我已将zoom.behaviour更改为d3.zoom,但我不清楚所需的其他更改.看起来比v3还要复杂! <!DOCTYPE html> & ...
- 用一个完整的案例讲解Python数据分析的整个流程和基础知识
先来想一下数据分析的流程,第一步获取数据,因此本节内容就是获取数据以及对数据的基本操作. 1.数据导入 1.1 导入.xlsx文件 要导入一个.xlsx后缀的Excel文件,可以使用pd.read_e ...
- C - Mind Control CodeForces - 1291C
菜到家了,题意都读不懂. 题目大意: 总共有n个人和n个数字 n个人拍成一队,n个数字也是有顺序的 你排在第m个位置 按照顺序的每个人可以拿走这个序列中的第一个数字或者最后一个数字 你可以在所有人操作 ...
- N - Aroma's Search CodeForces - 1293D math+greedy
作为DIV2的D题来讲,这个题目不算难. 题目大意:再规定的时间内寻找宝藏,第i个宝藏的位置为a*x(i-1)+b,a*y(i-1)+b.然后给出初始位置xs,ys和时间t让求再时间t内能够寻找到多少 ...
- D. Feeding Chicken(构造)
题目大意:将k个鸡放到一个n*m的矩阵中,要求每个鸡所占的rice的个数只差最小 题解:构造,设一共有cnt个rice,可以分cnt/k个,即每一只鸡要么占用cnt/k个rice,要么占cnt/k+1 ...
- F. Count Prime Pairs
单点时限: 2.0 sec 内存限制: 512 MB 对于数组a,如果i≠j并且ai+aj是一个质数,那么我们就称(i,j)为质数对,计算数组中质数对的个数. 输入格式 第一行输入一个n,表示数组的长 ...
- Java 基础讲解
Hello,老同学们,又见面啦,新同学们,你们好哦! 在看完本人的<数据结构与算法>专栏的博文的老同学,恭喜你们在学习本专栏时,你们将会发现好多知识点都讲解过,都易于理解,那么,没看过的同 ...