51nod-1273: 旅行计划
【传送门:51nod-1273】
简要题意:
给出一棵树,点数为n,现在你有一个旅行计划,从k城市出发,每天前往一个没去过的城市,并且旅途中经过的没有去过的城市尽可能的多(如果有2条路线,经过的没有去过的城市同样多,优先考虑编号最小的城市),直到所有城市都去过
求出每天旅行到达的城市的编号
题解:
首先,我们先把k作为根,求出每个点的深度
我们可以确定每天到达的城市一定是叶子节点,但我们并不能直接根据深度来确定到达城市的编号,因为两个叶子节点之间的路径上的点可能已经走过了,会有重复
我们发现每次走都相当于是一条链,我们可以将每个叶子节点的占据一条链(这条链为合理情况下,能够往上走最长的链)
对于两个深度相同的叶子节点,我们取编号小的点来占据它自己到公共祖先的路径,编号大的占据它自己到公共祖先的儿子这条路径,维护每个叶子节点占据的点数
然后按照点数从大到小,编号从小到大排序输出就可以了
参考代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
int x,y,next;
}a[];int len,last[];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
}
int dep[];
struct leaf
{
int x,d;
}p[];int tot;
bool cmp(leaf n1,leaf n2)
{
if(n1.d==n2.d) return n1.x<n2.x;
else return n1.d>n2.d;
}
int belong[],K;
void dfs(int x,int fa)
{
bool bk=false;
int t=;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y==fa) continue;
bk=true;dep[y]=dep[x]+;
dfs(y,x);
if(dep[p[belong[t]].x]<dep[p[belong[y]].x]||(dep[p[belong[y]].x]==dep[p[belong[t]].x]&&p[belong[t]].x>p[belong[y]].x)) t=y;
}
if(x==K) return ;
if(bk==false) belong[x]=++tot,p[tot]=(leaf){x,};
else belong[x]=belong[t],p[belong[x]].d++;
}
int main()
{
int n;
scanf("%d%d",&n,&K);K++;
len=;memset(last,,sizeof(last));
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);x++;
ins(x,i);ins(i,x);
}
dep[K]=;tot=;dfs(K,);
sort(p+,p+tot+,cmp);
printf("%d\n",K-);
for(int i=;i<=tot;i++) printf("%d\n",p[i].x-);
return ;
}
51nod-1273: 旅行计划的更多相关文章
- 51nod 1273 旅行计划——思维题
某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市.你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市, ...
- 51nod 1273 旅行计划(思维题)
一开始看到这题真的有点懵逼...一直在想着套算法,结果题解除了sort和dfs其他什么都没用到 显然每次到达的一定都是叶子,先从根节点dfs一遍,按深度对叶子降序排序,按这个顺序向根节点dfs,路径上 ...
- 【51Nod】1273 旅行计划 树上贪心
[题目]51Nod 1273 旅行计划 [题意]给定n个点的树和出发点k,要求每次选择一个目的地旅行后返回,使得路径上未访问过的点最多(相同取编号最小),旅行后路径上所有点视为访问过,求旅行方案.\( ...
- COGS 2. 旅行计划
2. 旅行计划 ★☆ 输入文件:djs.in 输出文件:djs.out 简单对比时间限制:3 s 内存限制:128 MB 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距 ...
- Crash的旅行计划
除草了.. Crash的旅行计划 [问题描述] 过不了多久,Crash就要迎来他朝思暮想的暑假.在这个暑假里,他计划着到火星上旅游.在火星上有N个旅游景点,Crash用1至N这N个正整数对这些景点标号 ...
- 洛谷P1137 旅行计划
P1137 旅行计划 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出发,并只往东走到城市i停止. 所以他就需要选择最先到达的城市,并制 ...
- 洛谷 P1137 旅行计划
旅行计划 待证明这样dp的正确性. #include <iostream> #include <cstdio> #include <cstring> #includ ...
- 牛客-小a的旅行计划 + 数学推导
小a的旅行计划 题意: 小a终于放假了,它想在假期中去一些地方游玩,现在有N个景点,编号为,同时小b也想出去游玩.由于一些特殊♂原因,他们的旅行计划必须满足一些条件 首先,他们可以从这N个景点中任意选 ...
- Problem 2 旅行计划 (travelling .cpp)———2019.10.6
lth tql,lzpclxf tql Orz Problem 2 旅行计划 (travelling.cpp)[题目描述]小 Z 打算趁着暑假,开启他的旅行计划.但与其他同学不同的是,小 Z 旅行时并 ...
随机推荐
- ASP.NET-后台cookie与前台JQUERY解析cookie
在controller中给cookie赋值 HttpCookie cookie =newHttpCookie("pageInfo"); cookie["page_inde ...
- angular-代码段
重复代码 <div ng-app="" ng-init="names=['Jani','Hege','Kai']"> <p>使用 ng- ...
- Oracle性能分析1:开启SQL跟踪和获取trace文件
当Oracle查询出现效率问题时,我们往往须要了解问题所在,这样才干针对问题给出解决方式.Oracle提供了SQL运行的trace信息,当中包括了SQL语句的文本信息.一些运行统计,处理过程中的等待, ...
- 从ORA-27300,ORA-27301到ORA-00064
近期因为session数量添加,须要调整session,也就是要调整process參数. 看是比較简单的一个问题,却遭遇了ORA-27300,ORA-27301.因为这个涉及到了有关内核參数k ...
- error[No partition metadata for topic test-1 due to kafka.common.LeaderNotAvailableException]
http://stackoverflow.com/questions/23228222/running-into-leadernotavailableexception-when-using-kafk ...
- 判断QString是否为纯数字,查找自身最长重复子字符串
1.判断QString是否为纯数字 bool IsDigitString(QString strSource) { bool bDigit = false; if (strSource.isEmpty ...
- 创建一个web user control
1.创建文件 添加,然后选择web user control 2.添加控件 在工具栏搜索button,然后拖动三个button上去 <%@ Control Language="C#&q ...
- 实现一个类似360的button
通过改写一个buttonst类,实现360效果的button. 主要可以完成:frame,hover,face效果,并且支持menu,tooltips 1)派生新的类QButton.添加虚函数,设置自 ...
- Kettle学习系列之Kettle的起源
不多说,直接上干货! Kettle起源于十年以前,本世纪初.当时啊,ETL工具千姿百态,比较流行的工具有50个左右,ETL框架数量比工具还要多些. 根据这些工具的各自起源和功能可以分为以下4种类型,如 ...
- PHP正则表达式函数总结
/* 测试环境:PHP5.3.29(PCRE8.32) */ 常用函数:(正则表达式规则基本同JS_RE_Read.txt) PS:1.PHP中的PCRE一般仅使用这三个修饰符:"i&quo ...