题意翻译
Panel 国将举办名为数字游戏的年度表演。每个省派出一名选手。
国家有n个编号从 1 到 n 的省,每个省刚好有一条路径将其与其他省相连。第 i个省出来的代表有 2^i名粉丝。
今年,主席打算削减开支,他想要踢掉 k 个选手。但是,被踢掉的选手的省将很 angry 并且不会让别的任何人从这个省经过。
主席想确保所有剩下选手的省都互相可达,他也希望最大化参与表演的选手的粉丝数。
主席该踢掉哪些选手呢?
输入格式
输入 n,k 。( k < n<= 10^6)
下来是 n-1 行,一行两个数,代表一条道路的起终点。
输出格式
升序输出要踢掉的选手编号。
Input
6 3
2 1
2 6
4 2
5 6
2 3
Output
1 3 4
Input
8 4
2 6
2 7
7 8
1 2
3 1
2 4
7 5
Output
1 3 4 5
感谢@poorpool 提供的翻译
(翻译复制自洛谷:https://www.luogu.org/problem/show?pid=CF980E )
读完题目,噢噢噢,肯定是一道DP呀!左想想,右想想,上个厕所回来依然没有思路,来,我告诉你,这是一道贪心!每次都去从大往小取,完事
诶,等等等等,这肯定是错的呀!杨子曰:杨子曰的永远是真理,要知道在这个题目中有一句话,叫做
#第 i个省出来的代表有 2^i名粉丝
懂了吧!(有人说不懂,我来解释:2i>2(i-1)+2(i-2)+…20,这就意味着,取最大的比取上其他的点都要优)那问题就很简单了,我们把点的编号从大往小看,最大的肯定取上,然后再看其他的点距离这个选上点的连通块的最短距离够不够,如果够就把这条路径上的所有点全部选上。
其实吧,你就这样去打代码还是有一点难(代码能力强上天的大佬除外),说一说打代码是需要注意的几个点:
首先你需要把编号最大的点变成整棵树的根,对整棵树重新DFS一遍,求出每个点的父亲
其次,在你看这个点的到根节点的距离时,你需要用树上倍增(想要对它有更深刻认识的童鞋,请戳→戳我),用f[i][j]表示结点i的第2^j 个父亲是谁,这样f[i][0]就是father,再用f[f[i][j-1]][j-1]更新,如果f[i][j]存在就把i跳到f[i][j](跳的距离是2^j),直到距离超了或跳到的这个点被标记了结束。
OK,完事
c++代码:
#include
using namespace std;
int f[1000005][35],tin[1000005],tout[1000005],head[1000005],b[1000005];
int cnt=0,nedge=0,sum=1;
struct Edge{
int next,to;
}edge[2000005];
void addedge(int a,int b){
edge[nedge].to=b;
edge[nedge].next=head[a];
head[a]=nedge++;
}
void dfs(int k,int fa){
f[k][0]=fa;
for (int i=head[k];i!=-1;i=edge[i].next){
int v=edge[i].to;
if (v==fa) continue;
dfs(v,k);
}
}
int main(){
int n,k;
memset(head,-1,sizeof(head));
memset(b,0,sizeof(b));
scanf("%d%d",&n,&k);
k=n-k-1;
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
dfs(n,0);
b[n]=1;
for (int j=1;j<=30;j++){
for (int i=1;i<=n;i++){
f[i][j]=f[f[i][j-1]][j-1];
}
}
for (int o=n-1;o>=1;o--){
int v=o,boo=0;
if (b[v]) continue;
if (k==0) break;
int t=k;
for (int i=30;i>=0;i--){
if (b[v]) {boo=1;break;}
if (t<(1<<i)) continue;
if (!f[v][i]) continue;
v=f[v][i];
t-=(1<<i);
}
if (b[v]) boo=1;
if (boo){
int v=o;
while(!b[v]){
k--;
b[v]=1;
v=f[v][0];
}
}
if (k==0) break;
}
for (int i=1;i<=n;i++){
if (!b[i]) cout<<i<<' ';
}
return 0;
}
于 XJZX 507机房
未经作者允许,严禁转载:https://blog.csdn.net/HenryYang2018/article/details/80998795