【题目】51Nod 1273 旅行计划

【题意】给定n个点的树和出发点k,要求每次选择一个目的地旅行后返回,使得路径上未访问过的点最多(相同取编号最小),旅行后路径上所有点视为访问过,求旅行方案。\(n,k \leq 5*10^4\)。

【算法】贪心

首先显然是访问所有叶子节点,先按叶子节点深度从大到小排序后依次访问,算出到达每个叶子节点路径上未访问过的点数,再按这个从大到小排序输出就是答案。

这里有个问题,就是前面的点访问后,后面的点答案会发生改变,可能会变得不优。但实际上我们考虑会干扰这个点变得不优的其它点都受到了相同的影响,所以它还是最优的。

复杂度\(O(n \ \ log \ \ n )\)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50010;
int n,k,tot,cnt,id[maxn],num,first[maxn],deep[maxn],fa[maxn],in[maxn];
bool vis[maxn];
struct edge{int v,from;}e[maxn*2];
void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}
void dfs(int x,int father){
for(int i=first[x];i;i=e[i].from)if(e[i].v!=father){
deep[e[i].v]=deep[x]+1;
fa[e[i].v]=x;
dfs(e[i].v,x);
}
}
void find(int x){
while(x!=k&&!vis[x]){
num++;vis[x]=1;x=fa[x];
}
if(!vis[k])vis[k]=1,num++;
}
bool cmp(int a,int b){return deep[a]>deep[b]||(deep[a]==deep[b]&&a<b);}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<n;i++){
int u;scanf("%d",&u);
insert(u,i);insert(i,u);in[i]++;in[u]++;
}
dfs(k,-1);
for(int i=0;i<n;i++)if(in[i]==1&&i!=k){
cnt++;id[cnt]=i;
}
sort(id+1,id+cnt+1,cmp);
for(int i=1;i<=cnt;i++){
num=0;
find(id[i]);
deep[id[i]]=num;
}
sort(id+1,id+cnt+1,cmp);
printf("%d\n",k);for(int i=1;i<=cnt;i++)printf("%d\n",id[i]);
return 0;
}

【51Nod】1273 旅行计划 树上贪心的更多相关文章

  1. 51nod 1273 旅行计划——思维题

    某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市.你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市, ...

  2. 51nod 1273 旅行计划(思维题)

    一开始看到这题真的有点懵逼...一直在想着套算法,结果题解除了sort和dfs其他什么都没用到 显然每次到达的一定都是叶子,先从根节点dfs一遍,按深度对叶子降序排序,按这个顺序向根节点dfs,路径上 ...

  3. U74201 旅行计划 树上找链长度

    题目背景 珂朵莉放假了,她打算去唐山旅行. 题目描述 我们简单地把唐山的共 nn 个景点看成是一棵树,有 n-1n−1 条边将它们连接起来,每个景点有一个游览指数 v_ivi​.珂朵莉的假期时间不长, ...

  4. COGS 2. 旅行计划

    2. 旅行计划 ★☆   输入文件:djs.in   输出文件:djs.out   简单对比时间限制:3 s   内存限制:128 MB 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距 ...

  5. Crash的旅行计划

    除草了.. Crash的旅行计划 [问题描述] 过不了多久,Crash就要迎来他朝思暮想的暑假.在这个暑假里,他计划着到火星上旅游.在火星上有N个旅游景点,Crash用1至N这N个正整数对这些景点标号 ...

  6. 【BZOJ3874】[AHOI&JSOI2014]宅男计划(贪心,三分)

    [BZOJ3874][AHOI&JSOI2014]宅男计划(贪心,三分) 题面 BZOJ 洛谷 题解 大力猜想一最长的天数和购买外卖的总次数是单峰的.感性理解一下就是买\(0\)次是\(0\) ...

  7. 2067: [Poi2004]SZN——树上贪心+二分

    题目大意: 给一棵树.求用最少的链覆盖这棵树(链不能相交),在这个基础上求最长的链最短可以是多少. n<=10000 题解: 肯定先处理第一问: 答案:$\sum_(du[i]-1)/2+1$ ...

  8. 洛谷P1137 旅行计划

    P1137 旅行计划 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出发,并只往东走到城市i停止. 所以他就需要选择最先到达的城市,并制 ...

  9. 洛谷 P1137 旅行计划

    旅行计划 待证明这样dp的正确性. #include <iostream> #include <cstdio> #include <cstring> #includ ...

随机推荐

  1. leetcode刷题笔记172 阶乘后的零

    题目描述: 给定一个整数 n,返回 n! 结果尾数中零的数量. 示例1: 输入: 输出: 解释: ! = , 尾数中没有零. 示例2: 输入: 输出: 解释: ! = , 尾数中有 个零. 说明: 你 ...

  2. 机房ping监控 smokeping+prometheus+grafana

    一.前言 1.本监控方案主要由smokeping+promethues+grafana组成.smokeping主要数据采集,promethues作为数据存储,grafana数据展示 2.其实smoke ...

  3. 简言MVC

    什么是MVC? MVC是一种代码的组织结构,在一个工程项目中,将代码的数据处理,逻辑单元和交互部分分离开来达到一种低耦合的效果,便于工程的修改.MVC中M代表Model,V代表View,C代表Cont ...

  4. 第二个Sprint冲刺第二天(燃尽图)

  5. 谈vs2013单元测试感想

    (1)安装篇:这个就不用多说啦,百度一个安装包进行安装. 之前下载过vs2013当时是抱着玩玩的心态,也没有安装成功,现在作为作业重新安装,并且进行单元测试.下面就是安装vs2013的具体过程以及我遇 ...

  6. iOS之Block总结以及内存管理

    block定义 struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(v ...

  7. C语言入门:01.C语言概述

    一.计算机和软件常识 1.计算机运行原理 (1)硬件基本组成:硬盘.内存.CPU (2)个部件之间的运作协调(下图)

  8. Java超类-java.lang.object

    Java是面向对象的,Object是所有对象的超类(不是继承,也不是实现接口) Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 如 ...

  9. SpringBoot(十四)_springboot使用内置定时任务Scheduled的使用(一)

    为什么使用定时? 日常工作中,经常会用到定时任务,比如各种统计,并不要求实时性.此时可以通过提前设置定时任务先把数据跑出来,后续处理起来更方便. 本篇文章主要介绍 springboot内置定时任务. ...

  10. NESTED内部事务异常会回滚 外部事务不会回滚 ;内部事务没有异常,外部事务有异常 则整体事务都回滚

    NESTED内部事务异常会回滚 外部事务不会回滚 :内部事务没有异常,外部事务有异常 则整体事务都回滚