博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1273 旅行计划(思维题)
阅读量:4330 次
发布时间:2019-06-06

本文共 1298 字,大约阅读时间需要 4 分钟。

  一开始看到这题真的有点懵逼...一直在想着套算法,结果题解除了sort和dfs其他什么都没用到

  显然每次到达的一定都是叶子,先从根节点dfs一遍,按深度对叶子降序排序,按这个顺序向根节点dfs,路径上没有被之前的叶子遍历过的点就是到达这个叶子时未经过的点的个数,于是我们跑出所有叶子未经过点的个数再排序一次输出就行了

#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long using namespace std;const int maxn=500010,inf=1e9;struct tjm{ int too,pre;}e[maxn];struct poi{ int w,pos;}a[maxn],b[maxn];int n,x,tot,cnt,root,t;int last[maxn];bool v[maxn];void read(int &k){ int f=1;k=0;char c=getchar(); while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar(); k*=f;}inline bool cmp(poi a,poi b){ return a.w==b.w?a.pos
b.w;}inline void add(int x,int y){e[++tot].too=y;e[tot].pre=last[x];last[x]=tot;}inline void dfs(int x,int dep,int fa){ bool flag=0; for(int i=last[x];i;i=e[i].pre) if(e[i].too!=fa)dfs(e[i].too,dep+1,x),flag=1; if((!flag)&&x!=root)a[++cnt].pos=x,a[cnt].w=dep;}inline bool dfs2(int x,int fa){ if(x==root||v[x])return 1; for(int i=last[x];i;i=e[i].pre) if(e[i].too!=fa)if(dfs2(e[i].too,x))return t++,v[x]=1,1; return 0;}int main(){ read(n);read(root); for(int i=1;i
View Code

先分析,再做题!

转载于:https://www.cnblogs.com/Sakits/p/7388172.html

你可能感兴趣的文章
C#中使用AOP
查看>>
在CANopen网络中通过LSS服务设置节点地址和网络波特率
查看>>
sql server 查询及删除重复记录的方法【转载】
查看>>
zTree多级扩展(一)
查看>>
Android学习二_八:Animation的使用(一) (转)
查看>>
Miller-Rabin
查看>>
VS中MFC连接MySQL的方法【转】
查看>>
PHP基础(二)
查看>>
lvm逻辑卷扩展方法
查看>>
JAVA锁
查看>>
C语言程序的内存分配方式
查看>>
将硬盘从FAT32转化为NTFS以支持everything搜索
查看>>
2、JAVA基础- 关键字、标识符、常变量、数据类型、注释等
查看>>
form表单上传图片格式
查看>>
颜色追踪块CamShift---33
查看>>
c++字符串变量---8
查看>>
phpcms V9首页 频道页 列表页 推荐位 简单获取文章浏览量和评论统计
查看>>
Navicat 报错1251连接不成功Mysql
查看>>
【新年福利】《正则表达式30分钟入门》APP版本发布
查看>>
R语言排序函数汇总
查看>>