tree

时间限制: 3 Sec  内存限制: 512 MB

题目描述

给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
题目保证有解。

输入

第一行V,E,need分别表示点数,边数和需要的白色边数。
接下来E行,每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。

输出

一行表示所求生成树的边权和。
V<=50000,E<=100000,所有数据边权为[1,100]中的正整数。

样例输入

  1. 2 2 1
  2. 0 1 1 1
  3. 0 1 2 0

样例输出

  1. 2
      这道题正解是二分+最小生成树。本题最烦人的就是限制白边的数量因此我们需要一个东西使白边被优先或滞后考虑。由于克鲁斯卡尔是按照边权排序,我们可以给白边附上一个假边权,这样就可以使白边被优先或滞后考虑了。
      由于我们还需要保证改变后所有白边的相对大小不变,因此我们不能直接对白边附上某个值而是统一加上或减去某一个值,这样就可以保证相对大小不变了。至于这个值到底应当是多少,我们完全可以二分去查找,毕竟它是满足单调的。
      这时一种比较坑爹的情况就会出现了,如果这个图当所有白边边权加x后在最小生成树中的数目比need大,加x+1后数量又比need小,我们该如何处理呢?我们可以想一下,是什么样的黑边被替换了呢?就是白边新增的边的边权-附加的权值,因此如果现在算进最小生成树中的白边数大于need,其实它也是可以被算进结果的。
      
  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<map>
  7. #include<queue>
  8. #include<string>
  9. #include<cmath>
  10. using namespace std;
  11. int n,m,ne;
  12. struct ro{
  13. int from,to;
  14. int l,col,rl;
  15. }road[];
  16. void build(int x,int y,int bh,int z,int zx){
  17. road[bh].from=x;
  18. road[bh].to=y;
  19. road[bh].rl=road[bh].l=z;
  20. road[bh].col=zx;
  21. }
  22. bool pd=;
  23. int px(ro a,ro b){
  24. if(a.l==b.l)
  25. return a.col<b.col;
  26. return a.l<b.l;
  27. }
  28. int fa[];
  29. map<int,bool> fw2[][];
  30. map<int,int> fw[][];
  31. void init(int x){
  32. for(int i=;i<=n;i++)
  33. fa[i]=i;
  34. for(int i=;i<=m;i++)
  35. {
  36. if(!road[i].col)
  37. {
  38. road[i].l=road[i].rl+x;
  39. }
  40. }
  41. sort(road+,road+m+,px);
  42. }
  43. int find(int x){
  44. if(fa[x]==x)
  45. return x;
  46. else
  47. return fa[x]=find(fa[x]);
  48. }
  49. void hb(int x,int y){
  50. int a=find(x);
  51. int b=find(y);
  52. if(a>b) fa[a]=b;
  53. else fa[b]=a;
  54. }
  55. int sum=0x7fffffff;
  56. bool check(int x){
  57. int js=,ans=,js2=,js3=;
  58.  
  59. for(int i=;i<=m;i++)
  60. {
  61. if(js==n-)break;
  62. if(find(road[i].from)!=find(road[i].to))
  63. {
  64. js++;
  65. if(road[i].col==)
  66. {
  67. js2++;
  68. }
  69. ans+=road[i].l;
  70. hb(road[i].from,road[i].to);
  71. }
  72. }
  73. if(js2>=ne)
  74. {
  75. sum=ans-ne*x;
  76. return ;
  77. }
  78. pd=;
  79. return ;
  80. }
  81. int main(){
  82. scanf("%d%d%d",&n,&m,&ne);
  83. for(int i=;i<=m;i++)
  84. {
  85. int x,y,z,zx;
  86. scanf("%d%d%d%d",&x,&y,&z,&zx);
  87. build(x,y,i,z,zx);
  88. }
  89. int li=-,ri=;
  90. while(li<=ri)
  91. {
  92. int mid=(li+ri)/;
  93. init(mid);
  94. if(check(mid))
  95. {
  96. li=mid+;
  97. }
  98. else
  99. ri=mid-;
  100. }
  101. printf("%d\n",sum);
  102. //while(1);
  103. return ;
  104. }
  1.  

[国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)的更多相关文章

  1. [国家集训队2012]tree(陈立杰)

    [国家集训队2012]tree(陈立杰) 题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. INPUT 第一行V,E,need分别表示 ...

  2. [国家集训队2012]middle(陈立杰)

    我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午…… 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的……今天又翻了几篇题解才恍然大悟,是把权值 ...

  3. [COGS 1799][国家集训队2012]tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...

  4. 洛谷.2619.[国家集训队2]Tree I(带权二分 Kruskal)

    题目链接 \(Description\) 给定一个无向带权连通图,每条边是黑色或白色.求一棵最小权的恰好有K条白边的生成树. \(Solution\) Kruskal是选取最小的n-1条边.而白边数有 ...

  5. 数据结构(动态树):[国家集训队2012]tree(伍一鸣)

    [问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...

  6. cogs1799 [国家集训队2012]tree(伍一鸣)

    LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...

  7. P2619 [国家集训队2]Tree I(最小生成树+二分)

    P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...

  8. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  9. [国家集训队2012]middle

    http://cogs.pro:8080/cogs/problem/problem.php?pid=1763 二分答案x 把区间内>=x的数设为1,<x的数设为-1 左端点在[a,b]之间 ...

随机推荐

  1. liunx 桥接 上网 ip配置 外部网络访问

    一.设置VMware 在vmware的[编辑]-->[虚拟网络编辑器]设置:将VMnet0设置为“桥接”,并桥接到宿主机器的网卡(可以是有线或者无线网络).   二.设置虚拟机系统(以cento ...

  2. Windows 10开发基础——指针事件和操作事件(一)

    主要内容: 1.指针事件 2.操作事件 1.指针事件 指针事件由各种活动输入源引发,包括触摸.触摸板.笔和鼠标(它们替代传统的鼠标事件).指针事件基于单一输入点(手指.笔尖.鼠标光标),但不支持基于速 ...

  3. WPF TextBlock 文字超长截断并显示省略符号

    <TextBlock x:Name=" FontSize="9pt" Margin="0 2 0 0 " VerticalAlignment=& ...

  4. SQLite Expert Professional 打开加密SQLite数据库

    原文 SQLite Expert Professional 打开加密数据库 (已修改) 版本:sqlite expert professional 4.2.0.739 (x86) 目的:用SQLite ...

  5. Failed to recover corrupt cache entry

    RangeError java.lang.RuntimeException: ERROR: Failed to recover corrupt cache entry at com.sun.deplo ...

  6. UWP-ListView到底部自动加载更多数据

    原文:UWP-ListView到底部自动加载更多数据 ListView绑定的数据当需要“更多”时自动加载 ListView划到底部后,绑定的ObservableCollection列表数据需要加载的更 ...

  7. libjingler-0.6.2在windows和ubuntu 10.04下的编译(Google Talk)

    Libjingle版本:0.6.2 所需的资源:         gtest-1.6.0.zip         http://download.csdn.net/detail/cl_gamer/48 ...

  8. 二、OpenSceneGraph3.4第一个示例

    1.在VS2015中创建一个OSG的空解决方案,并新建一个控制台工程,取名为Example 工程结构如下图所示: 2.工程设置 "Example"->属性,打开属性选项卡,需 ...

  9. python字典的内建函数

    In [70]: test=dict(x=1,y=2,z=3) In [71]: test Out[71]: {'x': 1, 'y': 2, 'z': 3} In [72]: a=['a','b', ...

  10. epoll模型的探索与实践

    我们知道nginx的效率非常高,能处理上万级的并发,其之所以高效离不开epoll的支持, epoll是什么呢?,epoll是IO模型中的一种,属于多路复用IO模型; 到这里你应该想到了,select, ...