某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市。你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市,并且旅途中经过的没有去过的城市尽可能的多(如果有2条路线,经过的没有去过的城市同样多,优先考虑编号最小的城市),直到所有城市都观光过一遍。现在给出城市之间的交通图T,以及出发地点K,你来设计一个旅行计划,满足上面的条件。例如:
 
(K = 2)
 
 
第1天 从2到0 (城市 1 和 0 变成去过的)
第2天 从0到6 (城市 4 和 6 变成去过的)
第3天 从6到3 (城市 3 变成去过的)
第4天 从3到5 (城市 5 变成去过的)
 
上图的输入数据为:0 1 2 2 1 4。共7个节点,除节点0之外,共6行数据。
第1个数0表示1到0有1条道路。
第2个数1表示2到1有1条道路。
Input
  1. 1行:2个数NK(1 <= N <= 50000, 0 <= K <= N - 1)
  2. 2 - N + 1行:每行一个数,表示节点之间的道路。
Output
  1. 输出旅行的路线图,即每天到达的城市编号。
Input示例
  1. 7 2
  2. 0
  3. 1
  4. 2
  5. 2
  6. 1
  7. 4
Output示例
  1. 2
  2. 0
  3. 6
  4. 3
  5. 5
    ————————————————————————————————————————————————————
    以下搬自51nod题解
    考虑将树根设为K,观察到以下结论:
    1. 每次必然会走到叶子,否则可以继续向下走到叶子,使得访问的点增多。
    2. 考虑每次访问到的未访问的点,一定是与叶子相连的、在叶子到点K路径上的一条连续的链,
    所以问题可以转化为:
    令每个叶子分别支配一条链,使得标号小的点尽量支配多的点,最后根据支配的点数多少、标号大小依次访问。
    以做法可以是树上贪心,从深到浅依次确定每个点被其子树里哪个叶子支配,
    然后使得那个点的支配点个数加一,
    最后用基数排序排出支配点数降序、标号大小升序即可。
    当然我懒 所以写的是sort代替基排
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int M=;
  6. int read(){
  7. int ans=,f=,c=getchar();
  8. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  9. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  10. return ans*f;
  11. }
  12. char s[];int len;
  13. inline void outx(int x)
  14. {
  15. if(!x){putchar('');return;}
  16. while(x)s[++len]=x%,x/=;
  17. while(len)putchar(s[len--]+);
  18. }
  19. int T,n,rt;
  20. int first[M],cnt;
  21. struct node{int to,next;}e[M*];
  22. void ins(int a,int b){e[++cnt]=(node){b,first[a]}; first[a]=cnt;}
  23. void insert(int a,int b){ins(a,b); ins(b,a);}
  24. int sum;
  25. struct pos{int d,pos;}p[M];
  26. bool cmp(pos a,pos b){return a.d!=b.d?a.d>b.d:a.pos<b.pos;}
  27. void dfs(int x,int fa,int deep){
  28. bool f=true;
  29. for(int i=first[x];i;i=e[i].next){
  30. int now=e[i].to;
  31. if(now!=fa) f=false,dfs(now,x,deep+);
  32. }
  33. if(f&&x!=rt) p[++sum].pos=x,p[sum].d=deep;
  34. }
  35. int vis[M];
  36. struct Ans{int h,pos;}q[M];
  37. bool qcmp(Ans a,Ans b){return a.h!=b.h?a.h>b.h:a.pos<b.pos;}
  38. int find(int x,int fa){
  39. if(vis[x]||x==rt) return ;
  40. for(int i=first[x];i;i=e[i].next){
  41. int now=e[i].to;
  42. if(now==fa) continue;
  43. if(find(now,x)) return T++,vis[x]=,;
  44. }
  45. return ;
  46. }
  47. int main()
  48. {
  49. int x;
  50. n=read(); rt=read();
  51. for(int i=;i<n;i++) x=read(),insert(i,x);
  52. for(int i=;i<=n;i++) p[i].pos=i;
  53. dfs(rt,-,); sort(p+,p++sum,cmp);
  54. for(int i=;i<=sum;i++){
  55. q[i].pos=p[i].pos;
  56. T=; find(p[i].pos,-);
  57. q[i].h=T;
  58. }
  59. sort(q+,q++sum,qcmp);
  60. printf("%d\n",rt); for(int i=;i<=sum;i++) printf("%d\n",q[i].pos);
  61. return ;
  62. }
  1.  
  1.  

51nod 1273 旅行计划——思维题的更多相关文章

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

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

  2. 【51Nod】1273 旅行计划 树上贪心

    [题目]51Nod 1273 旅行计划 [题意]给定n个点的树和出发点k,要求每次选择一个目的地旅行后返回,使得路径上未访问过的点最多(相同取编号最小),旅行后路径上所有点视为访问过,求旅行方案.\( ...

  3. csps模拟83最大异或和简单的括号序列旅行计划题解

    题面:https://www.cnblogs.com/Juve/articles/11733280.html 最大异或和: 简单博弈,小Q一定不会输,如果异或和为0,则平局,因为无论小Q如何拿,小T都 ...

  4. cogs 2. 旅行计划 dijkstra+打印路径小技巧

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

  5. COGS 2. 旅行计划

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

  6. zoj 3778 Talented Chef(思维题)

    题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...

  7. cf A. Inna and Pink Pony(思维题)

    题目:http://codeforces.com/contest/374/problem/A 题意:求到达边界的最小步数.. 刚开始以为是 bfs,不过数据10^6太大了,肯定不是... 一个思维题, ...

  8. Crash的旅行计划

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

  9. ZOJ 3829 贪心 思维题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...

随机推荐

  1. 使用shell脚本依据分区信息分批次的下载hive表格数据

    今天的业务场景大概是这样的,我想把hive表格下载到本地文件系统,然后把这个文件传送到另一个服务器上. 但是这个业务场景一个核心问题就是说我本地机器内存有限,hive表格大概是70G,我是不可能全部下 ...

  2. C语言实例解析精粹学习笔记——28

    实例28:从键盘读入实数 题目要求: 编制一个从键盘读入实数的函数readreal(double *rp).函数将读入的实数字符列转换成实数后,利用指针参数rp,将实数存于指针所指向的变量*rp. 思 ...

  3. Pandas 数值计算和统计基础

    1.(1) # 基本参数:axis.skipna import numpy as np import pandas as pd df = pd.DataFrame({'key1':[4,5,3,np. ...

  4. python基础之生成器、三元表达式、列表生成式、生成器表达式

    生成器 生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器. def foo(): print('first------>') yield 1 pri ...

  5. 「微信小程序免费辅导教程」26,基础内容组件rich-text体验

  6. Reverse Word in a String(翻转字符串)&字符串最后一个单词的长度

    1.题目: Given an input string, reverse the string word by word. For example,Given s = "the sky is ...

  7. loadrunner检查点设置失败,日志中SaveCount无法被正常统计出来

    在脚本正确的情况下的web_reg_find检查点检查失败,SaveCount无法被正常统计出来. 在检查项Text为中文的情况下, ******(我是被录制下来的代码) web_reg_find(& ...

  8. mysql用root账户建立用户和赋予权限

    1.创建用户 create user guest_test@localhost identified by "root";-- 创建名为guest_test的用户 2.赋予权限 - ...

  9. A. Vasya and Book

    题目原址 http://codeforces.com/contest/1082/problem/A 题目内容 一共n页书,现在位于第x位,想要看第y页,每次只能翻d页,注意总能翻到第1页和第n页. V ...

  10. COMMIT和ROLLBACK的用法

    从功能上划分,SQL语言可以分为DDL,DML和DCL三大类. 1.DDL(Data Definition Language)  数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言 : C ...