codeforces round364 div2E Connecting Universities
来源:互联网 发布:阿里云客服薪资 编辑:程序博客网 时间:2024/04/28 10:45
/* 题目描述:给出一棵树,节点数n<=2e5,每条树边的长度为1,在树上有2k个节点,将这2k个节点两两配对,问所有对 之间距离的最大值。*/#pragma warning(disable:4786)#pragma comment(linker, "/STACK:102400000,102400000")#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<stack>#include<queue>#include<map>#include<set>#include<vector>#include<cmath>#include<string>#include<sstream>#include<bitset>#define LL long long#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)#define mem(a,x) memset(a,x,sizeof(a))#define lson l,m,x<<1#define rson m+1,r,x<<1|1using namespace std;const int INF = 0x3f3f3f3f;const int mod = 1e9 + 7;const double PI = acos(-1.0);const double eps=1e-6;const int maxn = 2e5 + 5;int isu[maxn] , sz[maxn] , dis[maxn] , kk;LL ans;vector<int>G[maxn];void dfs1(int root , int fa , LL depth){ int siz = G[root].size() , nt; dis[root] = depth; if(isu[root]){ sz[root] = 1; ans += depth; } for(int i = 0 ; i<siz ; i++){ nt = G[root][i]; if(nt == fa) continue; dfs1(nt , root , depth + 1LL); sz[root] += sz[nt]; }}void solve(int root , int fa){ if(kk <= 0) return ; priority_queue< pair<int , int > >Q; int siz = G[root].size() , nt; for(int i = 0 ; i<siz ; i++){ nt = G[root][i]; if(nt == fa) continue; if(sz[nt] > 0){ Q.push( make_pair(sz[nt] , nt) ); } } if(isu[root]){ Q.push( make_pair(1 , root) ); } pair<int , int> f1 = Q.top() , f2; int fir = f1.first , sec = f1.second , sum = 0; if(Q.size() == 1){ solve(sec , root); } else{ Q.pop(); while(!Q.empty()){ f2 = Q.top(); Q.pop(); sum += f2.first; } sum = min(sum , kk); kk -= sum; ans -= 2LL * dis[root] * sum; if(kk > 0) solve(sec , root); }}int main(){ int n , k , x , y; scanf("%d %d", &n , &k); kk = k; for(int i = 1 ; i <= 2* k ; i++){ scanf("%d", &x); isu[x] = 1; } for(int i = 1 ; i< n ; i++){ scanf("%d %d", &x , &y); G[x].push_back(y); G[y].push_back(x); } ans = 0; dfs1(1 , 0 , 0); solve(1 , 0); printf("%lld\n" , ans); return 0;}
0 0
- codeforces round364 div2E Connecting Universities
- Codeforces 700B Connecting Universities(DFS)
- codeforces 701E. Connecting Universities 树
- Connecting Universities
- Codeforces Round #364 (Div. 1) B.Connecting Universities
- Codeforces Round #364 (Div. 2) E. Connecting Universities 贪心 + dfs
- Codeforces Round #364 (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. 2) E. Connecting Universities【两次dfs】
- Codeforces Round #364 (Div. 1) B. Connecting Universities(图论)
- Codeforces 700B Connecting Universities(树的中心)
- Codeforces 701E Connecting Universities【树的重心】
- Codeforces Round #364 (Div. 2) E Connecting Universities
- codeforces 700B Connecting Universities (贪心详解)
- Codeforces700B. Connecting Universities
- CF 700B Connecting Universities
- [codeforces700B]-Connecting Universities-贪心策略
- MySQL不重复插入,记录不存在则插入,存在则更新
- [源码学习] -- yii2源码学习笔记(一) -- 目录结构了解
- CryptoJS加密库使用及bug解决
- 设计模式-----代理模式
- android studio关于assets目录的创建、位置指向以及文件读取
- codeforces round364 div2E Connecting Universities
- Fragment正规写法,不产生漏洞
- C++新手上路第四天 静态Point
- 微信小程序开发(一) 微信登录流程
- Kafka——性能逆天的存在
- SpringMVC注解@RequestParam全面解析
- BZOJ1324: Exca王者之剑
- 学习记录——物理层
- python学习之路4------列表生成器