题意翻译

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

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

代码:

 #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. Rsync文件同步机备份工具使用

    一,Rsync简介 Rsync是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步的优秀工具.适用于多种操作平台. 全称是Remote synchronization 具有可使本地和远 ...

  2. Go语言 基本类型

    在内存中的形式 首先看一下在go中,一些基础类型在内存中是以什么形态存在的,如下图所示: 变量j的类型是int32, 而变量i的类型是int,两者不是同一个类型,所以赋值操作i=j是一种类型错误can ...

  3. 【Python数据挖掘】决策树、随机森林、Bootsing、

    决策树的定义 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树).其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别. ...

  4. 干货 | 蚂蚁金服是如何实现经典服务化架构往 Service Mesh 方向的演进的?

    干货 | 蚂蚁金服是如何实现经典服务化架构往 Service Mesh 方向的演进的? https://www.sohu.com/a/235575064_99940985 干货 | 蚂蚁金服是如何实现 ...

  5. 笛卡尔乘积 python语法

    修改为 bot_name = spider.settings.attributes['BOT_NAME'].value tablenameCommon = 'amazon_hot_new_releas ...

  6. iass,pass,cass,sass,vm,container

    分布式存储hdfs 大文件,swift 对象存贮. 为七牛的CDN系统目前大部分还不是自建的,采用的是整合其它CDN的方式做的.也就是说出了七牛的文件分发使用的是网宿和蓝汛的老牌CDN的分发节点,自身 ...

  7. 在ubuntu上部署Kubernetes管理docker集群示例, vxlan,gre

    http://www.chenshake.com/openstack-folsom-guide-for-ubuntu-12-04/ http://www.cnblogs.com/sammyliu/p/ ...

  8. 剑指Offer——翻转单词顺序列

    题目描述: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“studen ...

  9. What’s wrong with virtual methods called through an interface

    May 31, 2016 Calling a virtual method through an interface always was a lot slower than calling a st ...

  10. HDFS基本工作机制