CF911F Tree Destruction (树的直径,贪心)
题目链接
Solution
1.先找出树的直径.
2.遍历直径沿途的每一个节点以及它的子树.
3.然后对于每个非直径节点直接统计答案,令直径的两个端点为 \(x_1,x_2\) .
\]
最后再单独把直径拎出来,单独统计一次就好了.
正确性证明:
redbag 一句话解决:
如果说这其中的某个答案不是最优,那么找的直径不就是错的么。
"跑的飞快。"
Code
#include<bits/stdc++.h>
using namespace std;
const int maxn=200008;
struct sj{
int to,next;
}a[maxn*2];
int head[maxn],size,x,y,road[maxn];
int root,flag,n,cnt,far[5],kk,vis[maxn];
int dis[maxn][3],v[maxn],num;
long long ans;
int ans1[maxn],ans2[maxn],siz;
void add(int x,int y)
{
a[++size].to=y;
a[size].next=head[x];
head[x]=size;
}
void dfs(int x)
{
v[x]=1;
if(cnt>kk)
far[root==1?1:2]=x,kk=cnt;
for(int i=head[x];i;i=a[i].next)
{
int tt=a[i].to;
if(!v[tt])
cnt++,dfs(tt);
}
v[x]=0; cnt--;
}
void fuck(int x)
{
v[x]=1;
if(x==far[2]){flag=1;}
for(int i=head[x];i;i=a[i].next)
{
int tt=a[i].to;
if(!v[tt])
fuck(tt);
if(flag){road[++num]=x;vis[x]=1;break;}
}
v[x]=0;
}
void getans(int x)
{
v[x]=1;
for(int i=head[x];i;i=a[i].next)
{
int tt=a[i].to;
if(!v[tt]&&!vis[tt])
getans(tt),ans+=max(dis[tt][1],dis[tt][2]);
}
if(dis[x][1]>dis[x][2])
ans1[++siz]=far[1];
else ans1[++siz]=far[2];
ans2[siz]=x;
v[x]=0;
}
void getdis(int x,int to)
{
v[x]=1;
for(int i=head[x];i;i=a[i].next)
{
int tt=a[i].to;
if(!v[tt])
{dis[tt][to]=dis[x][to]+1; getdis(tt,to);}
}
v[x]=0;
}
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y),
add(x,y), add(y,x);
}
root=1; dfs(root);
root=far[1]; kk=0;
cnt=0; dfs(root);
fuck(root);
getdis(far[1],1); getdis(far[2],2);
for(int i=2;i<num;i++)
getans(road[i]),siz--;
for(int i=1;i<=kk;i++)ans+=i;
cout<<ans<<endl;
for(int i=1;i<=siz;i++)
cout<<ans1[i]<<' '<<ans2[i]<<' '<<ans2[i]<<endl;
for(int i=1;i<num;i++)
cout<<far[1]<<' '<<road[i]<<' '<<road[i]<<endl;
}
CF911F Tree Destruction (树的直径,贪心)的更多相关文章
- CF911F Tree Destruction 解题报告
CF911F Tree Destruction 题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 输入输出格式 输 ...
- lightoj 1094 Farthest Nodes in a Tree 【树的直径 裸题】
1094 - Farthest Nodes in a Tree PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
- Sonya and Ice Cream CodeForces - 1004E 树的直径, 贪心
题目链接 set维护最小值贪心, 刚开始用树的直径+单调队列没调出来... #include <iostream>#include <cstdio> #include < ...
- Codeforces 804D Expected diameter of a tree(树的直径 + 二分 + map查询)
题目链接 Expected diameter of a tree 题目意思就是给出一片森林, 若把任意两棵树合并(合并方法为在两个树上各自任选一点然后连一条新的边) 求这棵新的树的树的直径的期望长度. ...
- light oj 1094 Farthest Nodes in a Tree(树的直径模板)
1094 - Farthest Nodes in a Tree problem=1094" style="color:rgb(79,107,114)"> probl ...
- SP1437 Longest path in a tree(树的直径)
应该是模板题了吧 定义: 树的直径是指一棵树上相距最远的两个点之间的距离. 方法:我使用的是比较常见的方法:两边dfs,第一遍从任意一个节点开始找出最远的节点x,第二遍从x开始做dfs找到最远节点的距 ...
- [TJOI2017] 城市 (树的直径,贪心)
题目链接 Solution 这道题,调了我一晚上... 一直80分 >_<|| ... 考虑到几点: 分开任意一条边 \(u\) ,那么其肯定会断成两棵树. 肯定是分开直径上的边最优,否则 ...
- [CF911F]Tree Destruction
题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 首先我们知道,到一个点距离最远的点是直径的端点.考虑贪心,如果我 ...
- [Codeforces 911F] Tree Destruction 解题报告(贪心)
题目链接: http://codeforces.com/contest/911/problem/F 题目大意: 给你一棵树,每次挑选这棵树的两个度数为1的点,加上他们之间的边数(距离),然后将其中一个 ...
随机推荐
- [论文理解]SSD:Single Shot MultiBox Detector
SSD:Single Shot MultiBox Detector Intro SSD是一套one-stage算法实现目标检测的框架,速度很快,在当时速度超过了yolo,精度也可以达到two-stag ...
- CentOS lvm
1.创建PVpvcreate /dev/sdb /dev/sdc或pvcreate /dev/sdb1 /dev/sdc1 2.查看PVpvdisplay 3.创建VGvgcreate vgdata ...
- 2018.2.11 JS的定时器制作
定时器 1.定时器定义 var time = window.setInterval("执行名词",间隔时间) 关闭定时器 clearInterval(定时器名称) 倒计时定时器 s ...
- JsonPath 语法 与 XPath 对比
JsonPath 语法 与 XPath 对比 XPath JSONPath Description / $ the root object/element . @ the current obje ...
- 面向对象OONo.3单元总结
一,JML语言 1)JML理论基础:JML是一类语言,用来描述一个方法或一个类的功能.以及这个类在实现这个功能时需要的条件.可能改变的全局变量.以及由于条件问题不能实现功能时这个方法或类的行为,具有明 ...
- 中英文字符串截取函数msubstr
Thinkphp内置了一个可以媲美smarty的模板引擎,给我们带来了很大的方便.调用函数也一样,可以和smarty一样调用自己需要的函数,而官方也内置了一些常用的函数供大家调用. 比如今天我们说的截 ...
- shell脚本,awk取中间列的方法。
解释 1.$(int(NF/2)+1) 中int(NF/2)等于3,然后加1,就得到中间的4了. 2.$(NF/2+0.5) 相当于得出的是整数.NF/2是3.5,再由3.5+0.5,所以就是4了,也 ...
- Linux 命令、配置文件及操作
Linux 命令.配置文件及操作 命令 命令 参数 说明 A alias.unalias 命令别名 B C cat 查看文件内容 cd 切换目录 chown 修改拥有着 chgrp 修改所属组 chm ...
- ubuntu18.04+win10解决时钟不同步办法
安装ntpdate: 执行命令: sudo apt-get install ntpdate 设置校正服务器: sudo ntpdate time.windows.com 设置硬件时间为本地时间: 执行 ...
- 【php】instanceof
instanceof 的使用还有一些陷阱必须了解.在 PHP 5.1.0 之前,如果要检查的类名称不存在,instanceof 会调用__autoload().另外,如果该类没有被装载则会产生一个致命 ...