题目链接:

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. 【POJ 2352】 Stars

    [题目链接] http://poj.org/problem?id=2352 [算法] 树状数组 注意x坐标为0的情况 [代码] #include <algorithm> #include ...

  2. SPOJ COT2 Count on a tree II (树上莫队)

    题目链接:http://www.spoj.com/problems/COT2/ 参考博客:http://www.cnblogs.com/xcw0754/p/4763804.html上面这个人推导部分写 ...

  3. Android local socket学习总结

    转载请注明出处: http://blog.csdn.net/xiexh0921/article/details/7513628   ################################## ...

  4. MVC、控件、一般处理程序中的session and cookie

    Mvc中: session: if (!string .IsNullOrEmpty(find)) //设置 Session["oip"] = "无锡"; Vie ...

  5. JavaScript设计模式学习——builder pattern(建造者模式)

    个人理解的应用场景 举个例子,比如想要创建各种类型的车的实例,车的类型有很多种,但创建每种类型车的接口定义可能是一样的,就用到了此模式 相关概念的通俗解释 上述例子中接口的定义叫builder 接口到 ...

  6. UWP 读取XML文件

    一.读取本地XML文件时要将xxx.xml文件的“生成操作”改为“嵌入的资源”会比较好,在手机上运行的话需要改为“内容” <?xml version="1.0" encodi ...

  7. Paper阅读总结Day1

    Paper阅读总结Day1 1.Convolutional Neural Networks For Facial Expression Recognition 文章思想 简单的一篇关于表情识别的文章, ...

  8. ZBrush中设置背面遮罩的两种方法

    背面遮罩是ZBrush软件实时遮罩的一种,它的出现能够解决我们在模型雕刻时的一些问题.我们在 ZBrush®中雕刻一个比较薄的物体时,经常会不经意的雕刻到背面的物体.那么遇到此类状况该如何设置ZBru ...

  9. Error running Tomcat 6: Address localhost:8080 is already in use

    错误原因:8080端口被其他的应用占用!解决方案:第一步,命令提示符号,执行命令:netstat –anoActive ConnectionsProto Local Address          ...

  10. JS实现HTML打印机效果

    5月最近在学Django,所以所有的Demo都没有PO出去 <!DOCTYPE html> <html lang="en"> <head> &l ...