[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卢布,这 ...
随机推荐
- invalidate
转载请注明出处: 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴望了解 A ...
- isual Studio 2013编译ImageMagick---转
“该文引用自 CruiseYoung的:Visual Studio 2013编译ImageMagick http://blog.csdn.net/fksec/article/details/36008 ...
- 使用CocoaPods更新第三方库出错的解决办法
使用CocoaPods更新第三方库出错的解决办法 执行完pod install或pod update之后,控制台抛出以下警告信息: [!] The xx [Debug] target override ...
- vue中插件的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 实验楼—Mysql—查找最爱学的课程
转载:https://www.shiyanlou.com/challenges/2651 背景 从上节题目构建的课程数据库中提取每个用户最爱学的课程数据. 右边桌面是实验楼的服务器,服务器中的 MyS ...
- Centos7下安装Mongodb
Mongodb网盘路径:链接:https://pan.baidu.com/s/1rWJCPZ59EAW25ha1UF5czw 密码:u3zq 1.把安装包上传到linux服务器上,解压,然后我们把mo ...
- Spring项目配置log4j日志功能
一,添加log4j依赖包 可从官网上下载该依赖包log4j-x.x.xx.jar,下载后 build path,添加依赖包如使用maven,可以添加如下依赖 <!-- https://mvnre ...
- Android开发进度05
1,今日:目标:完成后台用户的增删改查 2,昨天:完成登录和注册功能 3,收获:熟练了SQLite操作 4,问题:无
- keepalived 和 heartbeat对比
Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP): Heartbeat是基于主机或网络的服务的高可用 ...
- pytorch 4 regression 回归
import torch import torch.nn.functional as F import matplotlib.pyplot as plt # torch.manual_seed(1) ...