[Codeforces 911F] Tree Destruction 解题报告(贪心)
题目链接:
http://codeforces.com/contest/911/problem/F
题目大意:
给你一棵树,每次挑选这棵树的两个度数为1的点,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少.
要求输出每次选择的两个点和删掉的点
题解:
贪心题,策略是每次选择一个度数为1的点和距离它较远的直径的端点(显然直径的端点度数为1),然后把这个点删掉保留直径的端点。直到只剩下直径的时候才开始删掉直径上的点
为什么?考虑到先删一个直径外的点再删直径的端点一定不会比删掉一个直径的端点再删这个点更劣(不妨画个图?)。
应该还有这么个结论吧,距离任意一个点最远的叶子节点一定是直径的一个端点,感觉挺正确的
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll; const int N=2e5+;
int n;
int d1[N],d2[N],deg[N],vis[N],a[N],b[N],c[N];
vector <int> g[N];
inline int read()
{
char ch=getchar();
int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void dfs(int x,int fa,int *d)
{
for (int i=;i<g[x].size();i++)
{
int y=g[x][i];
if (y==fa) continue;
d[y]=d[x]+;
dfs(y,x,d);
}
}
void out(int x,int fa,int goal)
{
for (int i=;i<g[x].size();i++)
{
int y=g[x][i];
if (vis[y]||y==fa) continue;
printf("%d %d %d\n",x,goal,x);
out(y,x,goal);
}
}
int main()
{
n=read();
for (int i=,u,v;i<n;i++)
{
u=read();v=read();
g[u].push_back(v);g[v].push_back(u);
deg[u]++;deg[v]++;
}
int p1,p2,mx=;
d1[]=;dfs(,-,d1);
for (int i=;i<=n;i++) if (d1[i]>mx) {mx=d1[i];p1=i;}
d1[p1]=;dfs(p1,-,d1);
mx=;for (int i=;i<=n;i++) if (d1[i]>mx) {mx=d1[i];p2=i;}
d2[p2]=;dfs(p2,-,d2);
queue<int> q;
ll ans=;
int tot=;
for (int i=;i<=n;i++) if (d1[i]+d2[i]!=d1[p2]&°[i]==) q.push(i);
while (!q.empty())
{
int k=q.front();q.pop();
ans+=max(d1[k],d2[k]);
a[++tot]=k;b[tot]=(d1[k]>d2[k])?p1:p2;c[tot]=k;vis[k]=;
for (int i=;i<g[k].size();i++)
{
int y=g[k][i];
if (vis[y]) continue;
--deg[y];
if (d1[y]+d2[y]!=d1[p2]&°[y]==) q.push(y);
}
}
ans+=1ll*(d1[p2]+)*d1[p2]/;
printf("%lld\n",ans);
for (int i=;i<=tot;i++) printf("%d %d %d\n",a[i],b[i],c[i]);
out(p1,-,p2);
return ;
}
[Codeforces 911F] Tree Destruction 解题报告(贪心)的更多相关文章
- CF911F Tree Destruction 解题报告
CF911F Tree Destruction 题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 输入输出格式 输 ...
- Codeforces 911F Tree Destruction
Tree Destruction 先把直径扣出来, 然后每个点都和直径的其中一端组合, 这样可以保证是最优的. #include<bits/stdc++.h> #define LL lon ...
- Codeforces 911F Tree Destruction(贪心 && 树的直径)
题目链接 Tree Destructi 题意 给定一棵树,每次可以选定树上的两个叶子,并删去其中的一个.答案每次加上两个选定的叶子之间的距离. 求最后答案的最大值. 首先求出树的某一条直径,令其端 ...
- Codeforces.911F.Tree Destruction(构造 贪心)
题目链接 \(Description\) 一棵n个点的树,每次可以选择树上两个叶子节点并删去一个,得到的价值为两点间的距离 删n-1次,问如何能使最后得到的价值最大,并输出方案 \(Solution\ ...
- Codeforces Round 665 赛后解题报告(暂A-D)
Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...
- Codeforces Round 662 赛后解题报告(A-E2)
Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...
- 【LeetCode】222. Count Complete Tree Nodes 解题报告(Python)
[LeetCode]222. Count Complete Tree Nodes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个 ...
- Codeforces Round #277.5 解题报告
又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...
- codeforces A. Cinema Line 解题报告
题目链接:http://codeforces.com/problemset/problem/349/A 题目意思:题目不难理解,从一开始什么钱都没有的情况下,要向每一个人售票,每张票价格是25卢布,这 ...
随机推荐
- bzoj3998: [TJOI2015]弦论(SAM+dfs)
3998: [TJOI2015]弦论 题目:传送门 题解: SAM的入门题目(很好的复习了SAM并加强Right集合的使用) 其实对于第K小的字符串直接从root开始一通DFS就好,因为son边是直接 ...
- IPK僵尸网络 看看其传播手法
转自:http://www.freebuf.com/vuls/154975.html 一.IPK僵尸网络概述 IPK僵尸家族是自2012年底就开始出现并长期持续活跃在境外的DDoS僵尸网络.2016年 ...
- 31.QT坐标系
dialog.h #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include <QLabel> #include ...
- ios中去除tableView的分割线
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
- CZLayer的阴影
CALayer有一个shadow属性 意思是阴影 shadowcolor //颜色 shadowoffset //偏移 shadowOpacity //透明度 layer有一个方法 mas ...
- javascript前端如何使用google-protobuf
1.首先下载google的protobuf的compiler,通过编译器可以将.proto文件转换为想要的语言文件. 下载地址:https://repo1.maven.org/maven2/com/g ...
- ThinkPHP5(目录,路径,模式设置,命名空间)
ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架 目录结构 路径: http://www.tp5.comm/index.php/admin/index/index入口文件 pu ...
- Windows下Java JDK安装和环境变量配置
[Java攻城狮学习路线](http://www.cnblogs.com/apollospotatolikett/p/8665123.html 1.JDK下载 下载地址:http://www.orac ...
- Date.getTime() 结果为 NaN
yyyy-MM-dd 格式的时间,部分浏览器环境下转换为 Date 对象后调用 getTime() 方法的结果为 NaN. 需要将 - 替换为 / var dateStr = '2019-01-01' ...
- BZOJ 1576 [USACO]安全路经Travel (树剖+线段树)
题目大意: 给你一张无向图,求1到其他节点 不经过最短路的最后一条边 的最短路长度,保证每个节点的最短路走法唯一 神题,$USACO$题目的思维是真的好 先$dijkstra$出最短路树 对于每个节点 ...