问题描述

  阿狸和桃子养了n个小阿狸, 小阿狸们每天都在一起玩的很开心. 作为工程师的阿狸在对小阿狸们之间的关系进行研究以后发现了小阿狸的人际关系由某种神奇的相互作用决定, 阿狸称之为“键”. 每个键有一个频率, 称为键频率, 是一个整数(单位Hz).
  由于小阿狸们每天成集团地黏在一起, 桃子希望他们能够分成更加独立的几团. 阿狸发现, 一旦小阿狸们分开, 独立的一块连在一起的几个小阿狸就会形成一个家族, 而家族的类型由这个家族的小阿狸的数量唯一确定(比如说只有一个小阿狸的家族显然就是单身码农, 两个小阿狸的显然是一对小阿狸恋人, 三个小阿狸的就是三口之家等等). 显然, 一个小阿狸和另一个小阿狸处于同一家族, 当且仅当两个小阿狸之间存在直接或间接的键组成的路径.
  桃子对每种小阿狸家族都有自己的喜好程度, 她希望所有的小阿狸家族喜好程度之和大于等于K.
  为了让小阿狸们分开来, 阿狸决定让某些键断裂, 只保留某一段频率的键, 比如说100Hz到140Hz频率的键, 这时频段宽度为40Hz. 当然, 阿狸希望频段宽度越小越好, 但至少要有一个小键. 你的任务就是求出最小的频段宽度.
  注意, 输入不保证全部键都有效时只有一个小阿狸家族.
输入格式
  第一行3个整数n(<=1000), m(<=5000), K(0~2^31-1).
  接下来1行n个整数, 第k的整数表示桃子对大小为k的小阿狸家族的喜爱程度.
  接下来m行, 每行3个整数, u, v, f. 表示u小阿狸和小阿狸v之间存键, 频率f Hz.
输出格式
  一个整数, 即最窄的频段宽度(不存在可行频段, 输出"T_T", 不含引号).
样例输入
4 4 52
1 50 2 9
1 2 6
2 3 8
3 4 4
1 4 3
样例输出
0
样例说明
  频段3Hz~3Hz或4Hz~4Hz或6Hz~6Hz或8Hz~8Hz
样例输入
4 4 10
1 5 2 9
1 2 6
2 3 8
3 4 4
1 4 3
样例输出
2
样例说明
  频段4Hz~6Hz
样例输入
4 4 10
1 4 2 9
1 2 6
2 3 8
3 4 4
1 4 3
样例输出
T_T
数据规模和约定
  对于 30% 的数据, n <=10
  对于 50% 的数据, n <=50 , m <=200
  对于 100% 的数据, n <=1000 , m <=3000
题解
  首先m<=5000,看不到这个就世界再见。
  一开始是肯定是把边排序,然后来枚举,我一开始是这样写的,两个两个,三个三个,四个四个枚举,然后就退化成n^3方了。
  Ngshily大爷讲了题解,我们在确定起点的情况下,依次把终点向后移动,每次考虑新加入的边造成的家族的影响,然后就是n^2了。

 #include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define mp make_pair
#define pb push_back
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second
using namespace std;
typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//********************************
const int maxn = , maxm = ;
pair<int, pii> edge[maxm];
int val[maxn], father[maxn], sze[maxn];
inline int getfather(int x) { return father[x] == x ? x : father[x] = getfather(father[x]); }
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
rep(i, , n) scanf("%d", &val[i]);
rep(i, , m) scanf("%d%d%d", &edge[i].yy.xx, &edge[i].yy.yy, &edge[i].xx);
sort(edge + , edge + + m);
int ret = inf;
rep(i, , m) {
rep(o, , n) sze[o] = , father[o] = o;
int ans = n * val[];
rep(j, i, m) {
if (j != i && edge[j].xx != edge[j - ].xx) {
if (ans >= k) {
ret = min(ret, edge[j - ].xx - edge[i].xx);
break;
}
}
int fx = getfather(edge[j].yy.xx), fy = getfather(edge[j].yy.yy);
if (fx != fy) {
father[fy] = fx;
ans -= val[sze[fy]] + val[sze[fx]];
sze[fx] += sze[fy];
sze[fy] = ;
ans += val[sze[fx]];
}
}
if (ans >= k) ret = min(ret, edge[m].xx - edge[i].xx);
}
if (ret == inf) puts("T_T");
else printf("%d\n", ret);
return ;
}

Tsinsen-A1491 家族【并查集】的更多相关文章

  1. Vijos 1034 家族 并查集

    描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲戚 ...

  2. codevs 1073 家族 并查集

    家族 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1073/ Description 若某个家族 ...

  3. [tsA1491][2013中国国家集训队第二次作业]家族[并查集]

    m方枚举,并查集O(1)维护,傻逼题,,被自己吓死搞成神题了... #include <bits/stdc++.h> using namespace std; struct tri { i ...

  4. CODEVS1073 家族 (并查集)

    一道裸的并查集,练练手不错. program CODEVS1073; var i,j,m,n,q,x,y,k1,k2,z:longint; f:..] of longint; function fin ...

  5. ZOJ2334 Monkey King 并查集 STL

    题意:两家原始人(猴)打交道后成为一家猴,打交道时两家分别派出最帅的两位猴子,颜值各自减半,问每次打交道后新家族最帅的猴子的颜值.当然,已经是一家子就没有必要打交道了,因为没有猴希望颜值降低,毕竟还得 ...

  6. 数据结构 之 并查集(Disjoint Set)

    一.并查集的概念:     首先,为了引出并查集,先介绍几个概念:     1.等价关系(Equivalent Relation)     自反性.对称性.传递性.     如果a和b存在等价关系,记 ...

  7. 并查集 (Union-Find Sets)及其应用

    定义 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的 ...

  8. Connect the Cities(hdu3371)并查集(附测试数据)

    Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  9. 还是畅通工程(hdu1233)并查集应用

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  10. 畅通工程(hdu1232)并查集

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

随机推荐

  1. gameUnity 0.15alpha 网络游戏框架

    在重要版本 0.2之前,先 出一个 0.15alpha 版本热热身. 0.15主要是添加了 动画事件 和一些 动画特效的类,比如快进,慢进,(类似被冰冻效果),但这些都不在这个  alpha版本中出现 ...

  2. acm课程练习2--1001

    题目描述 Now,given the equation 8x^4 + 7x^3 + 2x^2 + 3x + 6 == Y,can you find its solution between 0 and ...

  3. 学习笔记——Windows下cocos2d-x,eclipse中自编译

    cocos2d-x创建的安卓项目导入eclipse后. 在项目属性中配置Builders. 在eclipse编译还需要配置相应的变量,即后面提到的cygwin编译中要添加的变量. D:/cygdriv ...

  4. Git学习 -- 分支管理

    创建新分支,并切换到该分支 git checkout -b dev 这一句相当于以下两句: git branch dev 创建 git checkout dev 切换 查看当前分支 git branc ...

  5. CodeForces 412D Giving Awards

    根据给出的条件建边,然后进行dfs 对于某个点x,当x的后继都遍历完毕后,再输出x节点. 这样能保证所有约束条件. #include<cstdio> #include<cstring ...

  6. 十二月总结-and-2016年终总结

    回顾 今天是2016的最后一天了,所以今天来做一个年终总结是最好不过的了.各种期末考试随着而来,也就意味着在工大的第一个学期马上结束了.回顾一下这一年所获得或者失去的一些东西: 2月份在家焦虑的等待着 ...

  7. Chapter 1 First Sight——14

    I parked in front of the first building, which had a small sign over the door reading front office. ...

  8. GIT问题,error:src refspec master does not match any

    将本地GIT版本库PUSH到一个GITHUB上一个空的版本库时可能会出现如下错误error:src refspec master does not match any原因: 本地版本库为空, 空目录不 ...

  9. foo bar的意思

    有些朋友问:foo, bar是什么意思, 为什么C++书籍中老见到这个词. 我google了一下, 发现没有很好的中文答案.这个问题,在维基百科上有很好的回答.在这里翻译给大家. 译文: 术语foob ...

  10. wind7系统修改host

    http://jingyan.baidu.com/article/e5c39bf56564a539d7603312.html 由于软件注册的原因,我需要更改hosts文件来防止服务器验证!那么在我们修 ...