Codeforces Round #364 (Div. 2)E.Connecting Universities
来源:互联网 发布:小米手环数据修改攻略 编辑:程序博客网 时间:2024/04/24 16:55
题意:一棵树有n个点,边长都为1,在这n个点中有2*k个大学,这些大学不重复。现在要给这些大学两两牵网线,问需要网线的最大长度。
分析:考虑每条边对答案的贡献,每条边对答案的贡献就是他的子树上学校的点的数目和剩下的学校的数目的较小值。
具体做法就是,一次bfs,记录下此点的子节点中有多少个学校(包括它自身),那么与它父亲节点相连的边的贡献为min(cnt[id],2*k-cnt[id])(cnt[id]!=0)。
这道题和2016多校1的:hdu5723类似 点击打开链接
#include<iostream>#include<string>#include<stdio.h>#include<string.h>#include<vector>#include<math.h>#include<queue>#include<map>#include<set>#include<algorithm>using namespace std;#define MAXN 200005#define LL long long#define INF 0x7f7f7f7fconst double eps = 1e-10;struct edge{ LL en,next;}Edge[MAXN*2];LL p[MAXN],num,ans,k;LL cnt[MAXN],vis[MAXN],flag[MAXN];void init(){ memset(p,-1,sizeof(p)); num=0;}void add(LL st,LL en){ Edge[num].en=en; Edge[num].next=p[st]; p[st]=num++;}void dfs(LL id){ vis[id]=1; for(LL i=p[id];i!=-1;i=Edge[i].next) { LL en=Edge[i].en; if(!vis[en]) { dfs(en); cnt[id]+=cnt[en]; if(cnt[en]!=0) { ans+=min(2*k-cnt[en],cnt[en]); } } } if(flag[id]) cnt[id]++;}int main(){ LL n,i; while(scanf("%I64d%I64d",&n,&k)!=EOF) { init(); memset(flag,0,sizeof(flag)); for(i=1;i<=2*k;i++) { LL id; scanf("%I64d",&id); flag[id]=1; } for(i=1;i<=n-1;i++) { LL u,v; scanf("%I64d%I64d",&u,&v); add(u,v); add(v,u); } memset(vis,0,sizeof(vis)); memset(cnt,0,sizeof(cnt)); ans=0; dfs(1); printf("%I64d\n",ans); } return 0;}
0 0
- Codeforces Round #364 (Div. 2) E. Connecting Universities 贪心 + dfs
- Codeforces Round #364 (Div. 2)E.Connecting Universities
- Codeforces Round #364 (Div. 2) E. Connecting Universities【两次dfs】
- Codeforces Round #364 (Div. 2) E Connecting Universities
- AIM Tech Round 3 (Div. 2) E. Connecting Universities 【构造】
- Codeforces Round #364 (Div. 1) B.Connecting Universities
- Codeforces Round #364 (Div. 1) B. Connecting Universities
- Codeforces Round #364 (Div. 1) B Connecting Universities
- Codeforces Round #364 (Div. 1) B. Connecting Universities(图论)
- Codeforces Round #364 (Div. 2) E. Connecting Universities(从一棵树上挑出n*2个点,两两匹配,求总距离的最大值)
- 【Codeforces Round 364 (Div 2)E】【树上路径 贪心】Connecting Universities 树上2k个点配对使得路径之和尽可能大
- Codeforces Round #364 (Div. 1)-树的带权重心(模板)||贪心-Connecting Universities
- codeforces 701E. Connecting Universities 树
- codefoces #364 div2 E &&div 1 B Connecting Universities [图论]【求贡献】
- Codeforces 701E Connecting Universities【树的重心】
- Codeforces Round #364 (Div. 2) E DFS
- codeforces round364 div2E Connecting Universities
- CF#701 E. Connecting Universities (DFS)
- POJ 1258Agri-Net
- [概率dp 矩阵乘法] poj 3744 Scout YYF I
- java-学习-自我规划
- 枚举+求桥 Codeforces701F Break Up
- POJ1995 Raising Modulo Numbers
- Codeforces Round #364 (Div. 2)E.Connecting Universities
- HDU 1052 Tian Ji -- The Horse Racing
- 重构
- mysql cluster (mysql 集群)安装配置方案
- 浅谈Java的final关键字
- mysql分区技术测试
- 矩阵论还真有用:图片缩放旋转
- 初学java
- SSM框架基础入门学习1——servlet入门实例(包含mysql增查,实例免费下载)