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 ... 
随机推荐
- jQuery树形控件zTree
			初始化如下: function zTreeInit(){ parentCode = ""; setting = { view: { dblClickExpand: false, s ... 
- HDU4788_Hard Disk Drive
			水题. 但是我写挫了一个地方,Wa了三发.好吧,不能忍了. 还有,本屌不知道如何用printf输出%,哪位学过C++的大仙知道这是什么情况? 告诉我一声啊. #include <iostrea ... 
- 分布式文件系统服务器FastDFS
			1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制, 充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标, ... 
- 学习NAT时引出网关
			网关(Gateway) 网关实质上是一个网络通向其他网络的IP地址 只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信 
- Find the hotel HDU - 3193(RMQ)
			题意: 有n个旅馆,从这n个旅馆中找出若干个旅馆,使得这若干个旅馆满足这样的条件:不能从其它和剩下的旅馆中找到一个价格和距离都小于这个旅馆的旅馆... 解析: 按price 排序,若price相同, ... 
- TortoiseSVN的基本使用方法
			TotoiseSVN的基本使用方法 来源 https://blog.csdn.net/hecongzhen/article/details/37879801 在 项目管理实践教程一.工欲善其事,必先利 ... 
- 转:Python 文本挖掘:使用gensim进行文本相似度计算
			Python使用gensim进行文本相似度计算 转于:http://rzcoding.blog.163.com/blog/static/2222810172013101895642665/ 在文本处理 ... 
- 【BZOJ1562】【NOI2009】变换序列(二分图匹配)
			[BZOJ1562][NOI2009]变换序列 题面 BZOJ 洛谷 这题面写的是真的丑,还是先手动翻译成人话. 让你构造一个\(0..N-1\)的排列\(T\) 使得\(Dis(i,T_i)\)为给 ... 
- 洛谷 U14472 数据结构【比赛】  【差分数组 + 前缀和】
			题目描述 蒟蒻Edt把这个问题交给了你 ---- 一个精通数据结构的大犇,由于是第一题,这个题没那么难.. edt 现在对于题目进行了如下的简化: 最开始的数组每个元素都是0 给出nnn,optopt ... 
- Dirichlet 卷积学习笔记
			Dirichlet 卷积学习笔记 数论函数:数论函数亦称算术函数,一类重要的函数,指定义在正整数集上的实值或复值函数,更一般地,也可把数论函数看做是某一整数集上定义的函数. 然而百科在说什么鬼知道呢, ... 
