问题描述

  阿狸和桃子养了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. tomcat内存优化问题

    Java内存组成 1) 堆 运行时数据区域,所有类实例和数组的内存均从此处分配.Java 虚拟机启动时创建.对象的堆内存由称为垃圾回收器 的自动内存管理系统回收. 堆由两部分组成: 其中eden+fr ...

  2. PHP AJAX技术

    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX 通过在后台与服务器进行少量数据交换,使网页实现异步更新.这意味着可以在不重载整个页面的情况下,对网页的某些部分进行更 ...

  3. 转:Windows平台配置Appium+Java环境

    1) 安装JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装 ...

  4. WordPress安装到zen-cart产品页中

    把WordPress安装到zen-cart一个子目录里吧,设置好固定连接等这个文件/includes/templates/template_default/templates/tpl_product_ ...

  5. Magento首页显示产品

    Magento首页显示产品     经常用的比较琐碎,上官网发现一个稍微全一点的不过没有针对 具体使用过程中遇到的情况进行修正  这边只做一个备忘吧   (细节问题 按个别情况进行修改即可) New  ...

  6. jQuery validation

    之前做客户端验证感觉自己javascript 不行,虽然能写出来一完整的验证,但从不自信,一直觉得客户端验证是比较繁琐的事情,但是又不能不做,只到最开始接触ajax ,遇到了一个jQuery vali ...

  7. 一个web项目在myeclipse中add deployment时无法被识别出来的原因

    当我们一个web项目,在myeclipse中,add deployment时,可能发现,根本无法被识别成web项目,可能的原因有:   1. 项目的properties ->Myeclipse ...

  8. 处理Easyui的Datagrid无法及时刷新问题

    在Easyui中打打开窗口dialog控件,当做完修改操作之后,关闭dialog控件刷新Datagrid,有时候无法及时刷新. 1.JavaScript中的代码 function doEdit(){ ...

  9. POJ 1062 昂贵的聘礼详解最短路变形

    POJ上难得一见的中文题…… 思路:建立一个以0为源点的地图,那么Map[0][n]的值代表 第n号物品的价值,Map[i][j]代表用 j  替代 i 后,物品j的价值.我们认为酋长的承诺为节点 ‘ ...

  10. CodeForces 158C - Cd and pwd commands(模拟)

    这个题我们又把题意理解错了,队友翻译了以后给我解释,我问这个直接一个单词开头的是要找到这个文件夹吗,他说是,然后我就呵呵了..奔着树形结构去和字符串维护就去了...做了好久都没模拟出来,感觉做出来的人 ...