Comet OJ - Contest #9 & X Round 3 【XR-3】核心城市 【树
发布时间:2020-12-15 07:56:24 所属栏目:Java 来源:网络整理
导读:一、题目 【XR-3】核心城市 二、分析 题意就是在树中确定$K$个点,满足剩下的$N-K$个点中到这$K$个点的最大距离尽可能
一、题目【XR-3】核心城市 二、分析题意就是在树中确定$K$个点,满足剩下的$N-K$个点中到这$K$个点的最大距离尽可能小。 理解上肯定是确定一个根,这个根是这个图的中心。 可以通过根据结点的高度,从树的外层一层一层往里面剥,那么每次剥的结点一定是队列里比较靠外的,且加进去的点要么和他同层,要么是层数更高的。所以当减到还剩k个点的时候,它的高度就是答案。 三、AC代码#include <bits/stdc++.h> using namespace std; #define ll long long #define Min(a,b) ((a)>(b)?(b):(a)) #define Max(a,b) ((a)>(b)?(a):(b)) const int MAXN = 1e5; vector<int> G[MAXN + 13]; int Depth[MAXN + 13],Num[MAXN + 13]; int BFS(int n,int k) { memset(Depth,0,sizeof(Depth)); queue<int> que; for(int i = 1; i <= n; i++) { if(G[i].size() == 1) { Depth[i] = 1; que.push(i); } } int last = n; while(!que.empty()) { int u = que.front(); que.pop(); last--; if(last == k) return Depth[u]; for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; Num[v]--; if(Num[v] == 1) { Depth[v] = Max(Depth[v],Depth[u] + 1); que.push(v); } } } return 0; } void init(int n) { memset(Num,sizeof(Num)); for(int i = 1; i <= n; i++) { G[i].clear(); } } int main() { //freopen("input.txt","r",stdin); // freopen("out.txt","w",stdout); int n,k; while(scanf("%d%d",&n,&k)!=EOF) { int u,v; init(n); for(int i = 1; i < n; i++) { scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); Num[u]++,Num[v]++; } printf("%dn",BFS(n,k)); // cout << solve(n,k) << endl; } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java 字符串词频统计实例代码
- 具有透明文本字段的Java Nimbus LAF
- json解析时遇到英文双引号报错的解决方法
- LC 200 Number of Islands
- java – jvisualvm的代理配置问题
- Java concurrency集合之ConcurrentLinkedQueue_动力节点Jav
- java – 以同步方法读取值时的安全发布
- java – hashCode和equals为Collections.unmodifiableColle
- java – 激活器1.3.0对sbt项目造成的错误?
- [Mathematics][MIT 18.02]Detailed discussions about 2-D