treecnt 算法马拉松20(告别美国大选及卡斯特罗)
给定一棵n个节点的树,从1到n标号。选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少。
现需要计算对于所有选择k个点的情况最小选择边数的总和为多少。
样例解释:
一共有三种可能:(下列配图蓝色点表示选择的点,红色边表示最优方案中的边)
选择点{1,2}:至少要选择第一条边使得1和2联通。

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

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

第一行两个数n,k(1<=k<=n<=100000)
接下来n-1行,每行两个数x,y描述一条边(1<=x,y<=n)
一个数,答案对1,000,000,007取模。
3 2
1 2
1 3
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(告别美国大选及卡斯特罗)的更多相关文章
- 51Nod 算法马拉松21(迎新年)
这次打算法马拉松是在星期五的晚上,发挥还算正常(废话,剩下的题都不会= =). 讲讲比赛经过吧. 8:00准时发题,拿到之后第一时间开始读. A配对,看上去像是二分图最大权匹配,一看范围吓傻了,先跳过 ...
- 项目实战利用Python来看美国大选
一.项目介绍 首先分析美国总统竞选这个项目是一个烂大街的项目,但是他的确是一个适合Python新手入门的数据处理项目. 本人在大二刚刚学习了Python数据处理,学习时间不超过5个小时,但是已经可以完 ...
- 数据分析06 /pandas高级操作相关案例:人口案例分析、2012美国大选献金项目数据分析
数据分析06 /pandas高级操作相关案例:人口案例分析.2012美国大选献金项目数据分析 目录 数据分析06 /pandas高级操作相关案例:人口案例分析.2012美国大选献金项目数据分析 1. ...
- 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3
先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...
- 51NOD 算法马拉松8
题目戳这里:51NOD算法马拉松8 某天晚上kpm在玩OSU!之余让我看一下B题...然后我就被坑进了51Nod... A.还是01串 水题..怎么乱写应该都可以.记个前缀和然后枚举就行了.时间复杂度 ...
- python数据分析美国大选项目实战(三)
项目介绍 项目地址:https://www.kaggle.com/fivethirtyeight/2016-election-polls 包含了2015年11月至2016年11月期间对于2016美国大 ...
- 51nod 算法马拉松 34 Problem D 区间求和2 (FFT加速卷积)
题目链接 51nod 算法马拉松 34 Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$ ...
- 51Nod 算法马拉松23 开黑记
惨啊……虽然开了半天黑,但是还是被dalao们踩了…… 第二次开黑,还是被卡在rank20了,我好菜啊……= = 写一写比赛经过吧…… 看到题之后习惯性都打开,A~D看上去似乎并没有什么思路,F应该是 ...
- Python(一)数据结构和算法的20个练习题问答
数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. 因此,这 ...
随机推荐
- EXCEL ctrl+e 百变用法不只是你用的那么简单
Excel2013版本中,新增加了一个快捷键:Ctrl+E,可以依据字符之间的关系,实现快速填充功能.一些需要使用公式或者其他功能进行解决的问题,现在只要一个快捷键就可以实现了. 用法1:快速拆解出需 ...
- CentOS6源码安装zabbix服务器
1.下载安装包并解压 2.预环境搭建 3.创建zabbix用户,编译安装zabbix 4.配置mysql 5.配置zabbix-server 6.配置apache和php 7.添加开机自启动 1 yu ...
- Hadoop入门 概念
Hadoop是分布式系统基础架构,通常指Hadoop生态圈 主要解决 1.海量数据的存储 2.海量数据的分析计算 优势 高可靠性:Hadoop底层维护多个数据副本,即使Hadoop某个计算元素或存储出 ...
- day16 Linux三剑客之awk
day16 Linux三剑客之awk 1.什么是awk,主要作用是什么? 什么是awk,主要作用是什么? awk 主要用来处理文件,将文本按照指定的格式输出.其中包含变量,循环以及数组. 2.awk的 ...
- JavaScript小数、百分数的转换
百分数转化为小数 function toPoint(percent){ var str=percent.replace("%",""); str= str/10 ...
- 纯CSS圆环与圆
1. 两个标签的嵌套: <div class="element1"> <div class="child1"></div> ...
- Linux学习 - 系统定时任务
1 crond服务管理与访问控制 只有打开crond服务打开才能进行系统定时任务 service crond restart chkconfig crond on 2 定时任务编辑 crontab [ ...
- html块 布局
可通过<div>和<span>将html元素组合起来. Html块元素 大多数html元素被定义为块级元素或内联元素. 块级元素在浏览器显示时,通常会以新行来开始(和结束).例 ...
- 【Services】【Web】【LVS】lvs基础概念
1.简介 1.1. 作者:张文嵩,就职于阿里 1.2. LVS是基础四层路由.四层交换的软件,他根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机: 1.3. IPTABLES的请求转发路 ...
- RPC、HTTP、RESTful
RESTful RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义.RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT ...