问题描述

  阿狸和桃子养了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. HDU-1548--A strange lift--(BFS,剪枝)

    A strange lift   Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...

  2. HDU2952:Counting Sheep(DFS)

    Counting Sheep Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Tota ...

  3. angular实现select的ng-options4

    ng实现简单的select <div ng-controller="ngSelect"> <select ng-model="vm.selectVal& ...

  4. OSPF的基本配置及DR /BDR选举的实验

    OSPF的基本配置及DR /BDR选举的实验 实验拓扑: 实验目的:掌握OSPF的基本配置 掌握手工指定RID 掌握如何修改OSPF的接口优先级 观察DR BDR选举的过程 实验要求:R3当选为DR ...

  5. android - 自定义(组合)控件 + 自定义控件外观

    转载:http://www.cnblogs.com/bill-joy/archive/2012/04/26/2471831.html android - 自定义(组合)控件 + 自定义控件外观   A ...

  6. java删除文件夹 Java中实现复制文件或文件夹

    删除文件夹 import java.io.File; public class DeleteDir { /** * @param args */ public static void main(Str ...

  7. 素数路(prime)

    素数路(prime) 题目描述 已知一个四位的素数,要求每次修改其中的一位,并且要保证修改的结果还是一个素数,还不能出现前导零.你要找到一个修改数最少的方案,得到我们所需要的素数. 例如把1033变到 ...

  8. 整理书本(book)

    整理书本(book) 题目描述 小A想把他满屋子的书整理一下.书本分成若干堆.每一堆的书本都有质量w和价值V.小A的任务是将所有书合成一堆.因为小A认为合并i,j两堆的书所需要的力为w[i]-v[i] ...

  9. [转]Android下打印调试堆栈方法

    http://blog.csdn.net/freshui/article/details/9456889 打印堆栈是调试的常用方法,一般在系统异常时,我们可以将异常情况下的堆栈打印出来,这样十分方便错 ...

  10. ural1752 Tree 2

    Tree 2 Time limit: 1.0 secondMemory limit: 64 MB Consider a tree consisting of n vertices. A distanc ...