题目链接:

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]&&deg[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]&&deg[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 解题报告(贪心)的更多相关文章

  1. CF911F Tree Destruction 解题报告

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

  2. Codeforces 911F Tree Destruction

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

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

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

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

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

  5. Codeforces Round 665 赛后解题报告(暂A-D)

    Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...

  6. Codeforces Round 662 赛后解题报告(A-E2)

    Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...

  7. 【LeetCode】222. Count Complete Tree Nodes 解题报告(Python)

    [LeetCode]222. Count Complete Tree Nodes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个 ...

  8. Codeforces Round #277.5 解题报告

    又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...

  9. codeforces A. Cinema Line 解题报告

    题目链接:http://codeforces.com/problemset/problem/349/A 题目意思:题目不难理解,从一开始什么钱都没有的情况下,要向每一个人售票,每张票价格是25卢布,这 ...

随机推荐

  1. 英语发音规则---P字母

    英语发音规则---P字母 一.总结 一句话总结: 1.P发[p]音? paper ['peɪpə] n. 纸 plane [pleɪn] n. 飞机 pig [pɪg] n. 猪 ship [ʃɪp] ...

  2. dns tunnel C&C

    通过DNS控制主机以及执行命令 我的ubuntu 安装过程 1854 mkdir dns_tunnel_tool 1855 cd dns_tunnel_tool/ 1856 ls 1857 git c ...

  3. java格式化时间到毫秒

    转自:https://blog.csdn.net/iplayvs2008/article/details/41910835 java格式化时间到毫秒: SimpleDateFormat formatt ...

  4. WINDOWS系统注册表(读、写)

    读取注册表 写入注册表

  5. JAVA在线观看视频教程完整版

    今天给大家介绍一下JAVA在线观看视频教程完整版,我们知道Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语 ...

  6. The German Collegiate Programming Contest 2017

    B - Building 给一个m各面的多边形柱体,每一侧面有n*n个格子,现在对这些格子染色,看有多少种方式使得多面柱体无论如何旋转都不会与另一个一样. #include <bits/stdc ...

  7. (1)安装----anaconda3下配置pyspark【单机】

    1.确保已经安装jdk和anaconda3.[我安装的jdk为1.8,anaconda的python为3.6] 2.安装spark,到官网 http://spark.apache.org/downlo ...

  8. 一篇文章彻底弄懂Base64编码原理(转载)

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网 ...

  9. fflush()函数总结

    1. 概述 函数名: fflush() 功 能: 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时 头文件: stdio.h 原型: int fflush(FILE *stream),其中st ...

  10. CF482C Game with Strings (状压DP+期望DP)

    题目大意:甲和乙玩游戏,甲给出n(n<=50)个等长的字符串(len<=20),然后甲选出其中一个字符串,乙随机询问该字符串某一位的字符(不会重复询问一个位置),求乙能确定该串是哪个字符串 ...