Travel

Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u

  1. /*
    题意
  2. 给出n【节点数】,m【连线数】,q【查询次数】;
  3. 输入m组数据 u【起点】,v【终点】,cost【权值】; (u,v)和 (v,u)表示两种不同的连线
  4. 输入q组查询数据;
  5.  
  6. 要求
  7. 输出在m组数据中所有cost<q的所有节点连线的连线方式个数。
  8.  
  9. 注意:每个拥有n个节点的联通块有 n*(n-1)个联通分量 (连线数);
  10. 每次两个联通块相连总连线数应该是(n1+n2)*(n1+n2-1);
  11. 用一个数据来记录的话更新方式应该为 n-n1*(n1-1)-n2*(n2-1)+(n1+n2)*(n1+n2-1);
  12. */
  13.  
  14. //如果每一次都重新建立并查集,查询数q比较大的话肯定会超时的,看了别人博客说用离线思维;稍稍了解了一下啥叫离线思维。
  15.  
  16. //本题用离线思想,将查询按照X的大小升序排序,后面的查询就在前一步往后进行,复杂度减小很多

/*
神测试数据。。。。。【 T。T 】
1
5 5 12
2 3 6334
1 5 15724
3 5 5705
4 3 12382
1 3 21726
6333
6334
6335
12345
12381
12385
13000
233
5777
21726
21727
21725

*/

  1. //AC代码:
  1. #include"iostream"
  2. #include"cstdio"
  3. #include"cstring"
  4. #include"cmath"
  5. #include"algorithm"
  6. using namespace std;
  7. const int MX=2222222;
  8. long long ans[MX];
  9. int P[MX], num[MX];
  10.  
  11. struct node {
  12. int u, v, cost;
  13. } side[MX];
  14.  
  15. bool cmp_side(node a,node b) {
  16. return a.cost < b.cost;
  17. }
  18.  
  19. struct Que {
  20. int id, x; //id 记录输入时候的顺序 x记录查询值
  21. } Q[MX];
  22.  
  23. bool cmp_que(Que a,Que b) {
  24. return a.x<b.x;
  25. }
  26.  
  27. int find(int x) {
  28. return P[x]==x?x:(P[x]=find(P[x]));
  29. }
  30.  
  31. int main() {
  32. int T;
  33. scanf("%d", &T);
  34. while(T--) {
  35. int n, m, q;
  36. scanf("%d%d%d", &n, &m, &q);
  37. for(int i=1; i<=n; i++) {
  38. P[i]=i;
  39. num[i]=1; //初始化连通分量
  40. }
  41. for(int i=1; i<=m; i++) { //把无向边加入队列
  42. scanf("%d%d%d", &side[i].u, &side[i].v, &side[i].cost);
  43. }
  44. sort(side+1,side+m+1,cmp_side);//升序排序无向边
  45. for(int i=1; i<=q; i++) { //添加查询队列
  46. Q[i].id=i;
  47. scanf("%d",&Q[i].x);
  48. }
  49. sort(Q+1,Q+q+1,cmp_que); //按照查询复杂度排序答案。
  50. int k=1;
  51. long long s=0;
  52. for(int i=1; i<=m; i++) {
  53. while(k<=q&&side[i].cost>Q[k].x)ans[Q[k++].id]=s; //把答案按照ID的顺序保存到ans数组中
  54. int rt1=find(side[i].u),rt2=find(side[i].v);
  55. if(rt1!=rt2) {
  56. long long n1=num[rt1],n2=num[rt2];
  57. //每个拥有n个节点的联通块有 n*(n-1)个联通分量 (对点)
  58. s=s-n1*(n1-1)-n2 *(n2-1)+(n1+n2)*(n1+n2-1);//去掉两个根的联通量在加上总和的联通分量
  59. P[rt1]=rt2;
  60. num[rt2]+=num[rt1];//加上节点的数量
  61. }
  62. }
  63. //ans[Q[k].id]=s; // 【这里居然看在上面读入ans之后还没有到最后一个,后面再测试数据才发现了这个问题。。。】
  64. while(k<=q)
  65. ans[Q[k++].id]=s;
  66. for(int i=1; i<=q; i++)
  67. printf("%I64d\n",ans[i]); //按照离线保存的实际查询顺序输出
  68. }
  69. return 0;
  70. }
  1.  

  

  1.  

ACM : Travel-并查集-最小生成树 + 离线-解题报告的更多相关文章

  1. ACM数据结构-并查集

    ACM数据结构-并查集   并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合 ...

  2. 并查集 & 最小生成树详细讲解

    并查集 & 最小生成树 并查集 Disjoint Sets 什么是并查集?     并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将 ...

  3. ACM: 继续畅通工程-并查集-最小生成树-解题报告

    继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descri ...

  4. ACM: The Suspects-并查集-解题报告

    The Suspects Time Limit:1000MS Memory Limit:20000KB 64bit IO Format:%lld & %llu Description 严重急性 ...

  5. hdu 1863 畅通工程 (并查集+最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

  6. CodeForces892E 可撤销并查集/最小生成树

    http://codeforces.com/problemset/problem/892/E 题意:给出一个 n 个点 m 条边的无向图,每条边有边权,共 Q 次询问,每次给出 ki​ 条边,问这些边 ...

  7. CodeForces - 891C: Envy(可撤销的并查集&最小生成树)

    For a connected undirected weighted graph G, MST (minimum spanning tree) is a subgraph of G that con ...

  8. Travel 并查集

    题意:给一个图,若干询问,每次询问只经过边权<=w的边,x能到达的点数 并查集啊,对询问和边排序,直接合并,维护size,查询 #include<cstdio> #include&l ...

  9. acm专题--并查集

    题目来源:http://hihocoder.com/problemset/problem/1066 #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256M ...

随机推荐

  1. max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

    sh- /etc/sysctl.conf vm.max_map_count = #在/etc/sysctl.conf追加上面一条 #并执行命令: sysctl -p

  2. 什么是DMI,SMBIOS,符合SMBIOS规范的计算机的系统信息获取方法

    转自:http://www.cnblogs.com/gunl/archive/2011/08/08/2130719.html DMI是英文单词Desktop Management Interface的 ...

  3. Linux 标准目录结构

    初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp ...

  4. hdu 2393:Higher Math(计算几何,水题)

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

  5. Jquery获取iframe子/父窗口中的标签

    获取子窗口中的标签: $("#id",document.frames('iframename').document); 获取父窗口中的标签: $('#id', parent.doc ...

  6. linux下搭建属于自己的博客(WordPress安装)

    转自:http://www.cnblogs.com/xiaofengkang/archive/2011/11/16/2251608.html WordPress简介 WordPress 是一种使用 P ...

  7. usb设备驱动描述,王明学learn

    usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...

  8. loj 1038(dp求期望)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25915 题意:求一个数不断地除以他的因子,直到变成1的时候 除的次 ...

  9. 函数调用关于从Ring3转到Ring0 ESP堆栈变化

    在ring0堆栈获取ring3堆栈方式 第一种方式 [esp+4] == [esp+参数个数*4+4] 如果这里不相等就需要用第二种方式 [[esp+参数个数*4+8]] 这里面的值就是Ring3的堆 ...

  10. supervisor(一)基础篇

    这两天干的活,是让楼主写一个supervisor的listener,用来监控supervisor所管理子进程的状态,当子进程异常退出时,楼主写的这个listener将会触发报警.在这里总结下super ...