题意翻译

给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少.

首先我们知道,到一个点距离最远的点是直径的端点。考虑贪心,如果我要最大化一个不在选定直径上的点的贡献,一定是将它和某个直径的端点连在一起算贡献。也就是说在这个点消失前直径一直存在,所以我们先把直径外的点全部删除并选择一个较远的直径端点计算贡献,然后再删除直径上的点即可。

代码:

 #include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define M 200010
using namespace std;
int read()
{
char ch=getchar();int x=;
while(ch>''||ch<'') ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x;
}
int n,m,num,L,R,cnt;
int head[M],id[M],deep[M],f[M],fa[M],in[M];
int res1[M],res2[M],res3[M];
bool vis[M];
long long ans;
queue<int>Q;
struct point{int to,next;}e[M<<];
void add(int from,int to)
{
e[++num].next=head[from];
e[num].to=to;
head[from]=num;
}
void dfs(int x,int fa)
{
for(int i=head[x];i;i=e[i].next)
{
int to=e[i].to;
if(to==fa) continue;
deep[to]=deep[x]+;
dfs(to,x);
}
}
void mark(int x,int tar)
{
while()
{
vis[x]=true;int nxt=;
if(x==tar) return;
for(int i=head[x];i;i=e[i].next)
{
int to=e[i].to;
if(deep[to]==deep[x]-)
{
nxt=to;
break;
}
}
fa[x]=nxt;x=nxt;
}
}
int main()
{
n=read();
for(int a,b,i=;i<n;i++)
{
a=read();b=read();
add(a,b); add(b,a);
in[a]++,in[b]++;
}
deep[]=;
dfs(,);
for(int i=;i<=n;i++) if(deep[i]>deep[L]) L=i;
deep[L]=; dfs(L,);
for(int i=;i<=n;i++) f[i]=deep[i]-,id[i]=L;
for(int i=;i<=n;i++) if(deep[i]>deep[R]) R=i;
deep[R]=; dfs(R,);
for(int i=;i<=n;i++) if(deep[i]->f[i]) f[i]=deep[i]-,id[i]=R;
deep[L]=; dfs(L,); mark(R,L);
for(int i=;i<=n;i++) if(in[i]==&&!vis[i]) Q.push(i);
while(!Q.empty())
{
int x=Q.front();Q.pop();
res1[++cnt]=x;res2[cnt]=id[x];res3[cnt]=x;
ans+=f[x];
for(int i=head[x];i;i=e[i].next)
{
int to=e[i].to;
in[to]--;
if(!vis[to]&&in[to]==) Q.push(to);
}
}
for(int i=R;i!=L;i=fa[i])
{
res1[++cnt]=i;res2[cnt]=L;res3[cnt]=i;
ans+=deep[i]-deep[L];
}
printf("%lld\n",ans);
for(int i=;i<=cnt;i++) printf("%d %d %d\n",res1[i],res2[i],res3[i]);
return ;
}

[CF911F]Tree Destruction的更多相关文章

  1. CF911F Tree Destruction 解题报告

    CF911F Tree Destruction 题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 输入输出格式 输 ...

  2. CF911F Tree Destruction (树的直径,贪心)

    题目链接 Solution 1.先找出树的直径. 2.遍历直径沿途的每一个节点以及它的子树. 3.然后对于每个非直径节点直接统计答案,令直径的两个端点为 \(x_1,x_2\) . \[Ans=\su ...

  3. Codeforces 911F Tree Destruction

    Tree Destruction 先把直径扣出来, 然后每个点都和直径的其中一端组合, 这样可以保证是最优的. #include<bits/stdc++.h> #define LL lon ...

  4. 「CF911F」Tree Destruction

    传送门 Luogu 解题思路 显然的贪心策略,因为每次都要尽量使得删点后的收益最大. 我们可以求出树的直径(因为树上的任意一个节点与其距离最远的点一定是直径的端点). 然后我们对于所有不是直径上的点, ...

  5. Codeforces 911F Tree Destruction(贪心 && 树的直径)

    题目链接  Tree Destructi 题意  给定一棵树,每次可以选定树上的两个叶子,并删去其中的一个.答案每次加上两个选定的叶子之间的距离. 求最后答案的最大值. 首先求出树的某一条直径,令其端 ...

  6. Codeforces.911F.Tree Destruction(构造 贪心)

    题目链接 \(Description\) 一棵n个点的树,每次可以选择树上两个叶子节点并删去一个,得到的价值为两点间的距离 删n-1次,问如何能使最后得到的价值最大,并输出方案 \(Solution\ ...

  7. [Codeforces 911F] Tree Destruction 解题报告(贪心)

    题目链接: http://codeforces.com/contest/911/problem/F 题目大意: 给你一棵树,每次挑选这棵树的两个度数为1的点,加上他们之间的边数(距离),然后将其中一个 ...

  8. Educational Codeforces Round 35

    Nearest Minimums 相同的数里最小的数里的最小距离 Solution Two Cakes Solution Three Garlands 瞎比试 Solution Inversion C ...

  9. CodeForces - 963B Destruction of a Tree (dfs+思维题)

    B. Destruction of a Tree time limit per test 1 second memory limit per test 256 megabytes input stan ...

随机推荐

  1. Content-Negotiation Header Quality Values

    HTTP: The Definitive Guide 17.3.2 Content-Negotiation Header Quality Values The HTTP protocol define ...

  2. [已解决]centos6.4 php连接mysql和memcache提示权限不允许

    昨天新安装了64位系统,所以就重新安装了一个centos的虚拟机,配置了一个测试环境,刚开始是页面打不开,这个确定是selinux规则没有设置好使用如下命令解决: chcon -R -h -t htt ...

  3. Unity系统自带函数生命周期以及相互关系

    官方参考手册:http://docs.unity3d.com/Manual/ExecutionOrder.html unity脚本从唤醒到销毁都有着一套比较完善的生命周期,添加任何脚本都要遵守生命周期 ...

  4. etcd: request cluster ID mismatch错误解决【只适用于新建etcd集群或无数据集群】

    1.报错信息 Mar 29 05:45:31 xxx etcd: request cluster ID mismatch (got 414f8613693e2e2 want cdf818194e3a8 ...

  5. mysql数据池设置

    参考链接https://www.cnblogs.com/KKSoft/p/8040374.html python的数据库连接池包:DBUtils DBUtils提供两种外部接口: Persistent ...

  6. Spring Bean声明周期

    Bean的生命周期 理解Spring Bean的生命周期很容易.当一个bean被实例化时,它可能需要执行一些初始化使它转换成可用状态.同样,当bean不再需要,并且从容器中移除时,可能需要做一些清除工 ...

  7. java-mybaits-00503-延迟加载

    1.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: ...

  8. 把typora改为微软雅黑+Consolas

    前言 typora是一款非常方便的书写markdown文本的编辑器.官网:https://www.typora.io/ 对于字体强迫症患者来说,不把字体改成微软雅黑+Consolas,那是相当难受.本 ...

  9. 使用python操作文件实现购物车程序

    使用python操作文件实现购物车程序 题目要求如下: 实现思路 始终维护一张字典,该字典里保存有用户账号密码,购物车记录等信息.在程序开始的时候读进来,程序结束的时候写回文件里去.在登录注册的部分, ...

  10. HTML5游戏开发系列教程4(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-4/ 这篇文章是我们继续使用canvas来进行HTML5游戏开发系 ...