NYOJ 925 国王的烦恼 (并查集)
描述
C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛。两个小岛间可能存在多座桥连接。然而,由于海水冲刷,有一些大桥面临着不能使用的危险。如果两个小岛间的所有大桥都不能使用,则这两座小岛就不能直接到达了。然而,只要这两座小岛的居民能通过其他的桥或者其他的小岛互相到达,他们就会安然无事。但是,如果前一天两个小岛之间还有方法可以到达,后一天却不能到达了,居民们就会一起发起抗议。
现在C国的国王已经知道了每座桥能使用的天数,超过这个天数就不能使用了。现在他想知道居民们一共会发起多少次抗议。
- 输入
多组测试数据。 每组数据先输入两个正整数n和m。 接下来m行,每行三个整数a, b, t,分别表示该座桥连接a号和b号两个小岛,能使用t天。小岛的编号从1开始递增。(1≤n≤10000,1≤m≤100000,1<=a,b<=n,1≤t≤100000) - 输出
输出一个整数,表示居民们发起抗议的次数。 - 样例输入
4 4
1 2 2
1 3 2
2 3 1
3 4 3 - 样例输出
2 - 提示
对于样例:第一天后2和3之间的桥不能使用,不影响。第二天后1和2之间,以及1和3之间的桥不能使用,居民们会抗议。第三天后3和4之间的桥不能使用,居民们会抗议。
对于样例:第一天后2和3之间的桥不能使用,不影响。第二天后1和2之间,以及1和3之间的桥不能使用,居民们会抗议。第三天后3和4之间的桥不能使用,居民们会抗议。
对于样例:第一天后2和3之间的桥不能使用,不影响。第二天后1和2之间,以及1和3之间的桥不能使用,居民们会抗议。第三天后3和4之间的桥不能使用,居民们会抗议。
对于样例:第一天后2和3之间的桥不能使用,不影响。第二天后1和2之间,以及1和3之间的桥不能使用,居民们会抗议。第三天后3和4之间的桥不能使用,居民们会抗议。
对于样例:第一天后2和3之间的桥不能使用,不影响。第二天后1和2之间,以及1和3之间的桥不能使用,居民们会抗议。第三天后3和4之间的桥不能使用,居民们会抗议。
分析:
其实这题是最大生成树的问题,因为每过一天各小岛之间的桥的寿命全部减少一天,应该按桥的寿命从大到小来排序,每次把桥两端的小岛连接起来,若发现这个小岛已经被联通了,就不用再记录此时两个小岛之间桥的寿命了,因为两个小岛之间已经有寿命更长的桥连接了(直接或者间接)。到最后直接统计有多少寿命不同的桥(如果寿命相同,就意味着同一天有多次抗议,然而居民只能一天抗议一次)。
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stack>
#include<math.h>
using namespace std;
int parent[10009];
struct Node
{
int x;///a号小岛
int y;///b号小岛
int t;///能用的时间
} node[100009];
bool cmp(Node a,Node b)
{
return a.t>b.t;///按照能用的时间从大到小排序
}
int Find(int num)///找num的父亲
{
if(num==parent[num])
return num;
else
return parent[num]=Find(parent[num]);
}
int main()
{
int n,m;
int Time[100009];
int flag=0;
while(~scanf("%d%d",&n,&m))
{
flag=0;
for(int i=0; i<=n; i++)
parent[i]=i;
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].t);
}
sort(node,node+m,cmp);
int pa,pb;
for(int i=0; i<m; i++)
{
pa=Find(node[i].x);
pb=Find(node[i].y);
if(pa!=pb)///代表node[i].x与node[i].y是不连通的,也就意味着没有办法通行了
{
parent[pa]=pb;///让他俩成为连通的
Time[flag++]=node[i].t;///在把他们之间能够通行的时间存下
}
}
// cout<<"flag==="<<flag<<endl;
// cout<<"去重函数"<<endl;
// unique(Time,Time+flag);
int sum=unique(Time,Time+flag)-Time;///去重函数,因为可能在同一天内多个地方都不能够通行了,但是这算是一次
printf("%d\n",sum);
}
return 0;
}
NYOJ 925 国王的烦恼 (并查集)的更多相关文章
- nyoj 925 国王的烦恼(最小生成树)
/* 题意:N个城市中每两个城市有多条路径连接,可是因为路径存在的天数是有限的!以为某条路经不存在了 导致N个城市不能连通了,那么村名们就会抗议!问一共会有多少次抗议! 思路:最小生成树....我们用 ...
- NYOJ 925 国王的烦恼
从最后一天开始往前加边. 同一天的边同时加到图上,加完之后检查集合数量是否和没加之前有变化. 有变化的话,答案就+1. #include<cstdio> #include <iost ...
- NYOJ 208 Supermarket (模拟+并查集)
题目链接 描述 A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Pr ...
- nyoj 42-一笔画问题 (欧拉图 && 并查集)
42-一笔画问题 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:10 submit:25 题目描述: zyc从小就比较喜欢玩一些小游戏,其中就包括画 ...
- nyoj925_国王的烦恼_并查集
国王的烦恼 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能 ...
- Nyoj 布线问题(并查集&&图论)
描述南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有的楼都供上电.2.所用电线花费最少 输入 第一行是一个整数n表示有n组测试数据.(n ...
- nyoj 1022 合纵连横 经典并查集
思路:关键在于并查集的删点操作. 给每个诸侯国一个另外的编号,比如box[i]表示诸侯国i现在处于第box[i]个联盟,可以随时改变它的联盟编号,并且让box[i] = k, 实现删除操作.以前联盟中 ...
- NYOJ 1022 合纵连横 (并查集)
题目链接 描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法吞并那些实力弱的,让自己的领土面积不断扩大.而实力弱的诸侯王为了不让自己的领 ...
- NYOJ 129 树的判定 (并查集)
题目链接 描述 A tree is a well-known data structure that is either empty (null, void, nothing) or is a set ...
随机推荐
- 1."问吧APP"客户需求调查分析
产品名称:问吧 产品功能:实时提问回答和搜索 开发原因:任何人都会遇到问题,网上虽然有很多回答,但是互联网的信息错综复杂,开发这个APP就是为了让网络求助更加的合理有效,清除网络上的垃圾信息. 为知大 ...
- 2nd 简单四则运算更新
简单四则运算更新 功能:由随机数决定出题为10个以内的数字,并确定是否出现括号(仅限一对),顺序输出表达式,并用栈的方式进行计算,判断正误.其他功能有待进一步实现. 头文件 #include < ...
- 31. Ubuntu15.04系统中如何启用、禁用客人会话
https://jingyan.baidu.com/article/046a7b3edf9639f9c27fa995.html 31. Ubuntu15.04系统中如何启用.禁用客人会话 听语音 | ...
- 这套C#编码规范写不错
自己总结的C#编码规范--1.命名约定篇:http://www.cnblogs.com/luzhihua55/p/CodingConventions1.html 自己总结的C#编码规范--2.命名选择 ...
- PHP开发工具(CodeLobster PHP Edition)
参考:http://www.uzzf.com/soft/45948.html 产品名:ttrar.com 密 钥:dstp-187c-9cdd-9a60-e185-b280 CodeLobste ...
- 【C++】C++ static关键字详解
static的作用 1.隐藏 当我们编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其他的源文件也能访问.如,我们有源文件source1.cpp定义了一个全局变量i和函数Fu ...
- bzoj5127[Lydsy12月赛]数据校验
多少年不写题解了 题目描述: 著名出题人小 Q 出了一道题,这个题给定一个正整数序列 a1, a2, ..., an,并保证输入数据中,对于 a 的任意一个非空连续子区间 [l, r],该区间内出现过 ...
- python 序列化 pickle shelve json configparser
1. 什么是序列化 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称 ...
- 【Mybatis】<foreach>标签在mybatis中的使用
mapper.xml如下: <select id="selectCkspcb" parameterType="java.util.Map" resultT ...
- Remember the Word UVALive - 3942(dp+trie)
题意: 给S个不同的单词和一个长字符串 问将其分解为若干个单词有多少种方法(单词可重复使用) 解析: dp[i]表示在这个字符串中以某个位置i为起点的 的一段子字符串 则这个子字符串若存在某个前缀恰好 ...