题目链接

描述

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 国王的烦恼 (并查集)的更多相关文章

  1. nyoj 925 国王的烦恼(最小生成树)

    /* 题意:N个城市中每两个城市有多条路径连接,可是因为路径存在的天数是有限的!以为某条路经不存在了 导致N个城市不能连通了,那么村名们就会抗议!问一共会有多少次抗议! 思路:最小生成树....我们用 ...

  2. NYOJ 925 国王的烦恼

    从最后一天开始往前加边. 同一天的边同时加到图上,加完之后检查集合数量是否和没加之前有变化. 有变化的话,答案就+1. #include<cstdio> #include <iost ...

  3. NYOJ 208 Supermarket (模拟+并查集)

    题目链接 描述 A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Pr ...

  4. nyoj 42-一笔画问题 (欧拉图 && 并查集)

    42-一笔画问题 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:10 submit:25 题目描述: zyc从小就比较喜欢玩一些小游戏,其中就包括画 ...

  5. nyoj925_国王的烦恼_并查集

    国王的烦恼 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能 ...

  6. Nyoj 布线问题(并查集&&图论)

    描述南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有的楼都供上电.2.所用电线花费最少   输入 第一行是一个整数n表示有n组测试数据.(n ...

  7. nyoj 1022 合纵连横 经典并查集

    思路:关键在于并查集的删点操作. 给每个诸侯国一个另外的编号,比如box[i]表示诸侯国i现在处于第box[i]个联盟,可以随时改变它的联盟编号,并且让box[i] = k, 实现删除操作.以前联盟中 ...

  8. NYOJ 1022 合纵连横 (并查集)

    题目链接 描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法吞并那些实力弱的,让自己的领土面积不断扩大.而实力弱的诸侯王为了不让自己的领 ...

  9. NYOJ 129 树的判定 (并查集)

    题目链接 描述 A tree is a well-known data structure that is either empty (null, void, nothing) or is a set ...

随机推荐

  1. java——线性表接口实现

    线性表是存储顺序牌类的数据时最常用的数据结构. 实现线性表有两种方式.第一种是使用数组存储线性表的元素.数组是动态创建的.超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素复制到新建的 ...

  2. ant build.xml 解释!

    Ant的概念  Make命令是一个项目管理工具,而Ant所实现功能与此类似.像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant却克服了这些工具的缺陷.最初Ant开发者在开发跨 ...

  3. mysql 数据类型 及 常用命令

    一.数据类型 1.整型 数据类型 存储空间 说明 取值范围 TINYINT 1字节 非常小的整数 带符号值:-128~127 无符号值:0~255 SMALLINT 2字节 较小的整数 带符号值:-3 ...

  4. 解决Qt creator无法输入中文

    详细的方法来自以下网址: http://my.oschina.net/lieefu/blog/505363?p={{currentPage+1}} 需要说明的几点: 设置qmake 的路径使用自身的路 ...

  5. EL语法 ${person.id} 这里面的id指的是实例对象的成员变量

    EL语法 ${person.id} 这里面的id指的是实例对象的成员变量

  6. solr源码分析之searchComponent

    上文solr源码分析之数据导入DataImporter追溯中提到了solr的工作流程,其核心是各种handler. handler定义了各种search Component, @Override pu ...

  7. [Code Festival 2017 qual A] C: Palindromic Matrix

    题意 给出一个小写字母组成的字符矩阵,问能否通过重排其中的字符使得每行每列都是回文串. 分析 简化版:给出一个字符串,问能否通过重排其中的字符使得它是回文串.那么如果字符串长度为偶数,就需要a到z的个 ...

  8. Liunx 和 Win中的软链接详解

    用过Linux的朋友都知道linux中有软链接的概念,可以通过ln命令创建到目录或文件的软链接,软链接的好处就是可以让一个目录或文件有多个入口但保持单一物理位置,方便应用和管理.    1.命令格式: ...

  9. (一)Quartz2.2.1 简单例子

    转载至http://blog.csdn.net/a4307515/article/details/46985533 1.关键接口 Scheduler,任务调度的API:它可以用来启动或者终止任务等. ...

  10. CF530D sum in the tree

    我是题面.原题地址 很简单的一道贪心题 首先,先想想怎么判断是否合法 题目中说,a是自然数,那么子节点的s明显是不能比父节点大的,如果比父节点大,不合法! 所有深度为偶数的点的s被删除了,也只有深度为 ...