treecnt

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

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

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

样例解释:

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

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

 

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

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

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

    Wrapper---条件查询器 :使用它可以实现很多复杂的查询 几个案例 环境: 参照博客:MybatisPlus入门程序 1.条件查询 1.1 查询name不为空的用户,并且邮箱不为空的用户,年龄大 ...

  2. Jumpserver堡垒机容器化部署

    JumpServer 是符合 4A 的专业运维安全审计系统. 前提条件 已部署docker Jumpserver 对外需要开放 80 443 和 2222 端口 服务器.数据库.redis 等依赖组件 ...

  3. jsp的动态包含和静态包含

    jsp的动态包含和静态包含 例如:提取一个公共的页面(top.jsp)到/WEB-INF/jsp/common/目录下 动态包含: 被包含的页面也会独立编译,生成字节码文件,一般包含页面信息频繁变化的 ...

  4. Hadoop入门 集群时间同步

    集群时间同步 如果服务器在公网环境(能连接外网),可以不采用集群时间同步.因为服务器会定期和公网时间进行校准. 如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行 ...

  5. 学习java 7.8

    学习内容: 被static修饰的不需要创建对象,直接用类名引用即可 内部类访问特点:内部类可以直接访问外部类的成员,包括私有 外部类访问内部类的成员,必须创建对象 成员内部类,内部类为私有,Outer ...

  6. SQLITE_BTREE_H

    sqlite3.c, 237436行 = 全部源文件,找东西比多文件查找方便多了:-),字符串查找一点都不慢. 不要太害怕,SQLite说它的代码里有非常多是用来做数据完整性检查和测试的.但愿B树,虚 ...

  7. Vue相关,vue父子组件生命周期执行顺序。

    一.实例代码 父组件: <template> <div id="parent"> <child></child> </div& ...

  8. 【DFS与BFS】洛谷 P1135 奇怪的电梯

    题目:奇怪的电梯 - 洛谷 (luogu.com.cn) 因为此题数据范围较小,有dfs及bfs等多种做法. DFS 比较正常的dfs,注意vis数组一定要回溯,不然会漏情况 例如这个数据 11 1 ...

  9. Advanced C++ | Virtual Constructor

    Can we make a class constructor virtual in C++ to create polymorphic objects? No. C++ being static t ...

  10. 【Linux】【Services】【Web】Nginx基础

    1. 概念 1.1. 消息通知机制:同步synchronous,异步asynchronous 同步:等待对方返回信息 异步:被调用者通过状态.通知或回调通知调用者 状态:调用者每隔一段时间就需要检查一 ...