Time Limit: 1500/1000 MS (Java/Others)

 Memory Limit: 131072/131072 K (Java/Others)

Problem Description
Jack likes to travel around the world, but he doesn’t like to wait. Now, he is traveling in the Undirected Kingdom. There are n cities and m bidirectional roads connecting the cities. Jack hates waiting too long on the bus, but he can rest at every city. Jack can only stand staying on the bus for a limited time and will go berserk after that. Assuming you know the time it takes to go from one city to another and that the time Jack can stand staying on a bus is x minutes, how many pairs of city (a,b) are there that Jack can travel from city a to b without going berserk?
 
Input
The first line contains one integer T,T≤5, which represents the number of test case.

For each test case, the first line consists of three integers n,m and q where n≤20000,m≤100000,q≤5000. The Undirected Kingdom has n cities and mbidirectional roads, and there are q queries.

Each of the following m lines consists of three integers a,b and d where a,b∈{1,...,n} and d≤100000. It takes Jack d minutes to travel from city a to city b and vice versa.

Then q lines follow. Each of them is a query consisting of an integer x where x is the time limit before Jack goes berserk.

 
Output
You should print q lines for each test case. Each of them contains one integer as the number of pair of cities (a,b) which Jack may travel from a to b within the time limit x.

Note that (a,b) and (b,a) are counted as different pairs and a and b must be different cities.

 
Sample Input
1
5 5 3
2 3 6334
1 5 15724
3 5 5705
4 3 12382
1 3 21726
6000
10000
13000
 
 
Sample Output
2
6
12
 
Source
 
 
 
 
题意:给出一个图,有n个节点,m条边,q个询问
每一个询问给出x
问,图中有多少点对,点对有一条路径的边长中最大的一条边的权值<=x
注意:(a,b)和(b,a)算是不同的点对
 
在线的话,想不出什么好的解法
 
离线的话,先把询问的x和图中边的权值小到大排序
然后遍历一次询问
 
用并查集
w[i]表示若i是这个集合的代表节点,则w[i]=这个集合的点数,否则w[i]=0
 
当询问x时,我们要知道目前有多少个集合,集合的代表节点是谁,每一个集合的点数
则此时的点对数=各个集合的点数a*(a-1)的和
 
要快速找出每一个集合的点数,有数组w
那要怎么快速有多少个集合和集合的代表节点呢?
我刚开始的想法是用一个set保存每一个集合的代表节点,若一个节点不是代表节点了,就删除该节点,更行w
这样每次询问的时候需要遍历一遍set,还是太慢了
 
后来一想,不用啊,只要再有一个变量sum,每次合并集合的时候就更新sum就可以啦
sum+=w[fau]*w[fav]*2
这样对于每一个询问x,直接记录print=sum就可以了
 
 
 
 
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<set>
  5.  
  6. using namespace std;
  7.  
  8. struct Edge
  9. {
  10. int u,v,w;
  11. };
  12. Edge edge[+];
  13.  
  14. struct Query
  15. {
  16. int x,id;
  17. };
  18. Query qry[];
  19.  
  20. int w[+];
  21. long long print[];
  22. int fa[+];
  23.  
  24. void init(int n)
  25. {
  26. for(int i=;i<=n;i++){
  27. fa[i]=i;
  28. w[i]=;
  29. }
  30. }
  31.  
  32. bool cmp1(Edge z,Edge y)
  33. {
  34. return z.w<y.w;
  35. }
  36. bool cmp2(Query z,Query y)
  37. {
  38. return z.x<y.x;
  39. }
  40.  
  41. int find_fa(int a)
  42. {
  43. if(fa[a]==a)
  44. return a;
  45. else{
  46. fa[a]=find_fa(fa[a]);
  47. w[fa[a]]+=w[a];
  48. w[a]=;
  49. return fa[a];
  50. }
  51. }
  52.  
  53. void solve(int ,int ,int );
  54.  
  55. int main()
  56. {
  57. int test;
  58. scanf("%d",&test);
  59. while(test--){
  60. int n,m,Q;
  61. scanf("%d %d %d",&n,&m,&Q);
  62. init(n);
  63. for(int i=;i<=m;i++){
  64. scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].w);
  65. }
  66. for(int i=;i<=Q;i++){
  67. scanf("%d",&qry[i].x);
  68. qry[i].id=i;
  69. }
  70. solve(n,m,Q);
  71. }
  72. return ;
  73. }
  74.  
  75. void solve(int n,int m,int Q)
  76. {
  77. sort(edge+,edge+m+,cmp1);
  78. sort(qry+,qry+Q+,cmp2);
  79.  
  80. int cnt=;
  81. long long sum=;
  82. for(int i=;i<=Q;i++){
  83. while(cnt<=m&&edge[cnt].w<=qry[i].x){
  84. int fau=find_fa(edge[cnt].u);
  85. int fav=find_fa(edge[cnt].v);
  86. if(fau!=fav){
  87. sum+=w[fau]*w[fav]*;
  88. fa[fau]=fav;
  89. w[fav]+=w[fau];
  90. w[fau]=;
  91. }
  92. cnt++;
  93. }
  94. print[qry[i].id]=sum;
  95. }
  96.  
  97. for(int i=;i<=Q;i++){
  98. printf("%I64d\n",print[i]);
  99. }
  100.  
  101. return ;
  102. }
 
 

hdu 5441 travel 离线+带权并查集的更多相关文章

  1. hdu 5441 Travel 离线带权并查集

    Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...

  2. Hdu 2047 Zjnu Stadium(带权并查集)

    Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. How Many Answers Are Wrong (HDU - 3038)(带权并查集)

    题目链接 并查集是用来对集合合并查询的一种数据结构,或者判断是不是一个集合,本题是给你一系列区间和,判断给出的区间中有几个是不合法的. 思考: 1.如何建立区间之间的联系 2.如何发现悖论 首先是如何 ...

  4. hdu 2818 Building Block (带权并查集,很优美的题目)

    Problem Description John are playing with blocks. There are N blocks ( <= N <= ) numbered ...N ...

  5. hdu 3635 Dragon Balls (带权并查集)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. How Many Answers Are Wrong HDU - 3038 (经典带权并查集)

    题目大意:有一个区间,长度为n,然后跟着m个子区间,每个字区间的格式为x,y,z表示[x,y]的和为z.如果当前区间和与前面的区间和发生冲突,当前区间和会被判错,问:有多少个区间和会被判错. 题解:x ...

  7. hdu 3047–Zjnu Stadium(带权并查集)

    题目大意: 有n个人坐在zjnu体育馆里面,然后给出m个他们之间的距离, A B X, 代表B的座位比A多X. 然后求出这m个关系之间有多少个错误,所谓错误就是当前这个关系与之前的有冲突. 分析: 首 ...

  8. HDU 3047 Zjnu Stadium(带权并查集)

    题意:有一个环形体育场,有n个人坐,给出m个位置关系,A B x表示B所在的列在A的顺时针方向的第x个,在哪一行无所谓,因为假设行有无穷个. 给出的座位安排中可能有与前面矛盾的,求有矛盾冲突的个数. ...

  9. POJ 1984 Navigation Nightmare 【经典带权并查集】

    任意门:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K To ...

随机推荐

  1. hihoCoder挑战赛23

    hihoCoder挑战赛23 A.Emulator 题意 给一张图,有\(N(N \le 300)\)个点, 给出任意两点之间的最短路. 求最多可以去掉多少条边,使得任意两点的最短路长度不变. 思路 ...

  2. java基础之:匿名内部类

    在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以 了解到匿名内部类的使用.匿名内部类要注意的事项.如何初 ...

  3. C++的异常处理

    一.什么是异常处理 一句话:异常处理就是处理程序中的错误. 二.为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在<The C++ Programming ...

  4. 初识boost之boost::share_ptr用法

    boost中提供了几种智能指针方法:scoped_ptr shared_ptr intrusive_ptr weak_ptr,而标准库中提供的智能指针为auto_ptr. 这其中,我最喜欢,使用最多的 ...

  5. Instructions函数对照表:02 xmmintrin.h与SSE指令集[转]

    更多详情见——http://www.cnblogs.com/zyl910/archive/2012/04/26/md00.htmlSIMD函数整理:00 索引贴 R:寄存器.M:64位MM寄存器:X: ...

  6. glibc下的内存管理

    在解码过程中我们也遇到了类似的问题,第一次解码的音频比较大60s,耗了3G的内存,reset之后内存并没有退还给操作系统,第二次即使解一个10s的音频 几周前我曾提到,我被项目组分配去做了一些探究li ...

  7. Concurrent inserts on MyISAM and the binary log

    Recently I had an interesting surprise with concurrent inserts into a MyISAM table. The inserts were ...

  8. expect安装去测试

    1.下载expect和tcl 下载地址:http://download.csdn.net/download/tobyaries/5754943 2.安装expect tar -zxvf tcl8.4. ...

  9. Linux静态库和共享库

    1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...

  10. mvn使用问题

    http://mirrors.ibiblio.org/maven2/org/apache/maven/archetypes/ http://blog.csdn.net/u011340807/artic ...