treecnt

基准时间限制:1 秒 空间限制:131072 KB

给定一棵n个节点的树,从1到n标号。选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少。

现需要计算对于所有选择k个点的情况最小选择边数的总和为多少。

样例解释:

一共有三种可能:(下列配图蓝色点表示选择的点,红色边表示最优方案中的边)

选择点{1,2}:至少要选择第一条边使得1和2联通。

 

选择点{1,3}:至少要选择第二条边使得1和3联通。

选择点{2,3}:两条边都要选择才能使2和3联通。

Input
  1. 第一行两个数nk(1<=k<=n<=100000)
  2. 接下来n-1行,每行两个数x,y描述一条边(1<=x,y<=n)
Output
  1. 一个数,答案对1,000,000,007取模。
Input示例
  1. 3 2
  2. 1 2
  3. 1 3
Output示例
  1. 4
    思路:考虑每一条边的贡献。
    一条边把一棵树分成两部分,当这条边有贡献时,k个点必然分布在这条边分隔开的两部分。
    总情况数等于Cn,k),设其中一部分点数为x,另一部分则为n-x,不合法情况数等于Cx,k)+C(n-x,k);然后要解决的就是咋去
    找一条边两边点的个数,那么我们以某个点为根dfs找出各个点的子树的度,然后遍历每条边,那么当前两个点,度小的必然为另一个的子树,那么x就找出来了。
    复杂度O(n);
  1. 1 #include<stdio.h>
  2. 2 #include<algorithm>
  3. 3 #include<iostream>
  4. 4 #include<string.h>
  5. 5 #include<math.h>
  6. 6 #include<queue>
  7. 7 #include<stdlib.h>
  8. 8 #include<set>
  9. 9 #include<vector>
  10. 10 typedef long long LL;
  11. 11 using namespace std;
  12. 12 typedef struct node
  13. 13 {
  14. 14 int x;
  15. 15 int y;
  16. 16 } ss;
  17. 17 ss ans[100005];
  18. 18 vector<int>vec[100005];
  19. 19 int cnt[100005];
  20. 20 bool flag[100005];
  21. 21 int dfs(int n);
  22. 22 LL N[100005];
  23. 23 const LL mod = 1e9+7;
  24. 24 LL quick(LL n,LL m);
  25. 25 int main(void)
  26. 26 {
  27. 27 int n,k,i;
  28. 28 N[0] = 1;
  29. 29 for(i = 1; i <= 100000; i++)
  30. 30 {
  31. 31 N[i] = N[i-1]*(LL)i%mod;
  32. 32 }
  33. 33 while(scanf("%d %d",&n,&k)!=EOF)
  34. 34 {
  35. 35 // int i;
  36. 36 memset(cnt,0,sizeof(cnt));
  37. 37 memset(flag,0,sizeof(flag));
  38. 38 for(i = 0; i <= n; i++)
  39. 39 vec[i].clear();
  40. 40 for(i = 0; i < n-1; i++)
  41. 41 {
  42. 42 scanf("%d %d",&ans[i].x,&ans[i].y);
  43. 43 vec[ans[i].x].push_back(ans[i].y);
  44. 44 vec[ans[i].y].push_back(ans[i].x);
  45. 45 }
  46. 46 dfs(1);
  47. 47 LL ni = N[n-k]*N[k]%mod;
  48. 48 ni = quick(ni,mod-2);
  49. 49 LL sum = N[n]*ni%mod;
  50. 50 sum = sum*(n-1)%mod;
  51. 51 for(i = 0; i < n-1; i++)
  52. 52 {
  53. 53 int x = cnt[ans[i].x];
  54. 54 int y = cnt[ans[i].y];
  55. 55 int aa = min(x,y);
  56. 56 int bb = n-aa;
  57. 57 if(aa >= k)
  58. 58 {
  59. 59 LL xx = N[aa-k]*N[k]%mod;
  60. 60 ni = quick(xx,mod-2);
  61. 61 ni = N[aa]*ni%mod;
  62. 62 sum = sum - ni;
  63. 63 sum = (sum%mod)+mod;
  64. 64 sum%=mod;
  65. 65 }
  66. 66 if(bb >= k)
  67. 67 {
  68. 68 LL xx = N[bb-k]*N[k]%mod;
  69. 69 ni = quick(xx,mod-2);
  70. 70 ni = N[bb]*ni%mod; //printf("%lld\n",ni);
  71. 71 sum = sum - ni;
  72. 72 sum = (sum%mod)+mod;
  73. 73 sum%=mod;
  74. 74 }
  75. 75 }
  76. 76 printf("%lld\n",sum);
  77. 77 }
  78. 78 }
  79. 79 int dfs(int n)
  80. 80 {
  81. 81 flag[n] = true;
  82. 82 int i;
  83. 83 for(i = 0; i < vec[n].size(); i++)
  84. 84 {
  85. 85 int x = vec[n][i];
  86. 86 if(!flag[x])
  87. 87 {
  88. 88 cnt[n]+=dfs(x);
  89. 89 }
  90. 90 }
  91. 91 cnt[n]++;
  92. 92 return cnt[n];
  93. 93 }
  94. 94 LL quick(LL n,LL m)
  95. 95 {
  96. 96 LL ask = 1;
  97. 97 n%=mod;
  98. 98 while(m)
  99. 99 {
  100. 100 if(m&1)
  101. 101 ask = ask*n%mod;
  102. 102 n = n*n%mod;
  103. 103 m>>=1;
  104. 104 }
  105. 105 return ask;
  106. 106 }

treecnt 算法马拉松20(告别美国大选及卡斯特罗)的更多相关文章

  1. 51Nod 算法马拉松21(迎新年)

    这次打算法马拉松是在星期五的晚上,发挥还算正常(废话,剩下的题都不会= =). 讲讲比赛经过吧. 8:00准时发题,拿到之后第一时间开始读. A配对,看上去像是二分图最大权匹配,一看范围吓傻了,先跳过 ...

  2. 项目实战利用Python来看美国大选

    一.项目介绍 首先分析美国总统竞选这个项目是一个烂大街的项目,但是他的确是一个适合Python新手入门的数据处理项目. 本人在大二刚刚学习了Python数据处理,学习时间不超过5个小时,但是已经可以完 ...

  3. 数据分析06 /pandas高级操作相关案例:人口案例分析、2012美国大选献金项目数据分析

    数据分析06 /pandas高级操作相关案例:人口案例分析.2012美国大选献金项目数据分析 目录 数据分析06 /pandas高级操作相关案例:人口案例分析.2012美国大选献金项目数据分析 1. ...

  4. 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3

    先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...

  5. 51NOD 算法马拉松8

    题目戳这里:51NOD算法马拉松8 某天晚上kpm在玩OSU!之余让我看一下B题...然后我就被坑进了51Nod... A.还是01串 水题..怎么乱写应该都可以.记个前缀和然后枚举就行了.时间复杂度 ...

  6. python数据分析美国大选项目实战(三)

    项目介绍 项目地址:https://www.kaggle.com/fivethirtyeight/2016-election-polls 包含了2015年11月至2016年11月期间对于2016美国大 ...

  7. 51nod 算法马拉松 34 Problem D 区间求和2 (FFT加速卷积)

    题目链接  51nod 算法马拉松 34  Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$ ...

  8. 51Nod 算法马拉松23 开黑记

    惨啊……虽然开了半天黑,但是还是被dalao们踩了…… 第二次开黑,还是被卡在rank20了,我好菜啊……= = 写一写比赛经过吧…… 看到题之后习惯性都打开,A~D看上去似乎并没有什么思路,F应该是 ...

  9. Python(一)数据结构和算法的20个练习题问答

    数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. 因此,这 ...

随机推荐

  1. SQL-用到的数据库语句总结

    0.SELECT * FROM  CHARACTER_SETS LIMIT 0,10   #从CHARACTER_SETS表中,从第1行开始,提取10行[包含第1行] 1.SELECT * FROM  ...

  2. Ubuntu16.04安装 2.8.5版本Ansible

    wget https://bootstrap.pypa.io/pip/2.7/get-pip.py && python get-pip.py pip install --upgrade ...

  3. day8 基本数据类型之字典

    day8 基本数据类型之字典 一.字典(dict) 1.用途: 2.定义方式:在{}内用逗号分隔开多个元素,每个元素都是key:value的形式,其中value可以使任意类型,而key必须是不可变类型 ...

  4. postgresql安装部署

    一.下载安装: 1.下载: 官网下载地址:https://www.postgresql.org/download/linux/redhat/ 也可以用这个:https://www.enterprise ...

  5. 3.7 rust 静态块

    Cargo.toml [dependencies] lazy_static = "1.4.0" main.rs #[macro_use] extern crate lazy_sta ...

  6. Linux学习 - fdisk分区

    一.fdisk命令分区过程 系统一旦重启,分区将消失 1 添加新硬盘 直接在虚拟机上添加 2 查看新硬盘 fdisk -l 3 分区 fdisk /dev/sdb fdisk进入/dev/sdb硬件设 ...

  7. POST/GET请求中RequestBody和RequestParam的应用场景

    POST请求时 @RequestBody --> JSON字符串部分 @RequestParam --> 请求参数部分 application/json格局图   图一.png form- ...

  8. 监控网站是否异常的shell脚本

    本节内容:shell脚本监控网站是否异常,如有异常就自动发邮件通知管理员. 脚本检测流程,如下:1,检查网站返回的http_code是否等于200,如不是200视为异常.2,检查网站的访问时间,超过M ...

  9. oracle体系结构(图)

  10. 【Services】【Web】【LVS】lvs基础概念

    1.简介 1.1. 作者:张文嵩,就职于阿里 1.2. LVS是基础四层路由.四层交换的软件,他根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机: 1.3. IPTABLES的请求转发路 ...