P5022-旅行【基环树,dfs】

正题

评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P5022


题目大意

一棵树(可能是基环树),从1出发,每到达一个新的点就记录下编号。求一种走法使得记录下来的编号字典序最小。


解题思路

我们先不考虑基环树。我们可以发现每次走字典序小的点就好了。我们可以排序一下就可以做到这点。
之后我们考虑基环树,我们暴力删边将基环树变为一棵普通的树。然后计算答案。
时间复杂度:O(n2)O(n^2)O(n2)


code

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define N 5010
using namespace std;
struct node{int to,next;
}a[2*N];
struct line{int x,y;
}l[2*N];
int tot,n,m,t,ls[N],in[N],state[N],w[N],ans[N],x,y,q[N];
bool k[N][N],v[N];
void addl(int x,int y)//加边
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;in[y]++;
}
bool topsort(){int l=0,r=0;for (int i=1;i<=n;i++) if(in[i]==1) q[++r]=i;while(l<r) {int now=q[++l];for (int i=ls[now];i;i=a[i].next){int y=a[i].to;if(in[y]>1){in[y]--;if(in[y]==1) q[++r]=y;}}}if(r==n) return true;return false;
}//拓扑求环
bool cmp(line x,line y)
{return x.y>y.y;}
void dfs(int x)//走一遍
{state[++t]=x;v[x]=true;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(k[x][y]||v[y]) continue;dfs(y);}
}
void check()//判断是否为更小字典序
{int i;bool flag=false;for(i=1;i<=n;i++)if(state[i]<ans[i]){flag=true;break;}else if(state[i]>ans[i]) return;if(!flag) return;for(;i<=n;i++)ans[i]=state[i];
}
void get_ans(int xs)//暴力删边
{int x=xs,b=0,i,last=0;do{w[++b]=x;in[x]=1;for(i=ls[x];i;i=a[i].next){int y=a[i].to;if(in[y]>1){x=y;break;}}}while(i);//记录环的每个点w[++b]=xs;for(int i=1;i<b;i++)//枚举删除的边{k[w[i]][w[i+1]]=k[w[i+1]][w[i]]=true;memset(v,0,sizeof(v));t=0;dfs(1);check();k[w[i]][w[i+1]]=k[w[i+1]][w[i]]=false;}
}
int main()
{memset(ans,127/3,sizeof(ans));scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);l[i]=(line){x,y};l[i+m]=(line){y,x};}sort(l+1,l+1+2*m,cmp);//排序tot=1;for(int i=1;i<=2*m;i++)//加边{addl(l[i].x,l[i].y);}if(m==n-1)//普通的树{dfs(1);for(int i=1;i<=n;i++)printf("%d ",state[i]);return 0;}topsort();for(int i=1;i<=n;i++)if(in[i]>1){get_ans(i);break;}for(int i=1;i<=n;i++)printf("%d ",ans[i]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【填坑】博客搬家造成的博客重复问题

原本我的博客数量是差不多八十几篇&#xff0c;昨天晚上一看&#xff0c;怎么变成一百三十多篇了。 惊讶之余有点不可思议&#xff0c;查了才发现原来有几十篇是重复的&#xff0c;后来删掉了一些&#xff0c;但还是有很多 有些也不是重复的&#xff0c;我从知乎发的东西也被搬…

[编程入门]猴子吃桃的问题

猴子吃桃问题。猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。 第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时&#xff0c;见只剩下一个桃子了…

Javafx的WebEgine执行window对象设置属性后为undefined

一、场景复现 window10 jdk1.8u221 package main;import javafx.application.Application; import javafx.beans.value.ObservableValue; import javafx.concurrent.Worker; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.Sta…

P4168-[Violet]蒲公英【分块】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP4168 题目大意 询问区间众数 解题思路 将数字离散化&#xff0c;然后分块。对于数组vi,j,kv_{i,j,k}vi,j,k​&#xff0c;表示i∼ji\sim ji∼j个块&#xff0c;kkk的个数。对于询问(l,r)(l,r)(l,r)&…

使用acs-engine在Azure中国区部署kubernetes集群详解

1. acs-engine简介 ACS是微软在2015年12月推出的一项基于容器的云端PaaS服务。说简单点&#xff0c;acs-engine就是一个ARM模板生成器&#xff0c;用户只需要配置几个简单的参数来描述容器集群的规格&#xff0c;然后acs-engine将这个容器集群描述文件转化成一组ARM&#xff08…

C++描述杭电OJ 2011.多项式求和 ||

C描述杭电OJ 2011.多项式求和 || Problem Description 多项式的描述如下&#xff1a; 1 - 1/2 1/3 - 1/4 1/5 - 1/6 … 现在请你求出该多项式的前n项的和。 Input 输入数据由2行组成&#xff0c;首先是一个正整数m&#xff08;m<100&#xff09;&#xff0c;表示测试实…

【Java】continue和break区别

先总结下&#xff1a;break先跳出整个大的循环&#xff0c;而continue跳出的是相对小的循环 也就是说他们的区别核心在于循环的大小 就举个例子吧&#xff0c;用for循环从一数到十&#xff0c;到五用上break和continue的区别 用break&#xff1a; public class test_01 { pu…

JS中令人发指的valueOf方法介绍

转载自 JS中令人发指的valueOf方法介绍 彭老湿近期月报里提到了valueOf方法&#xff0c;兴致来了翻了下ECMA5里关于valueOf方法的介绍&#xff0c;如下&#xff1a; 15.2.4.4 Object.prototype.valueOf ( ) When the valueOf method is called, the following steps are take…

P3203-[HNOI2010]弹飞绵羊【分块】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP3203 题目大意 nnn个装置。到第iii个装置会被往前弹aia_iai​个。 两种操作 修改aia_iai​和询问从iii出发要多少次弹射可以弹出去。 解题思路 分块。对于每个点&#xff0c;维护要多少步弹出该块和弹…

Lyft的TypeScript实践

来自Lyft的前端工程师Mohsen Azimi介绍了Lyft向TypeScript转型的过程&#xff0c;说明JavaScript类型系统的重要性、为什么Lyft选择TypeScript以及他们的一些实践经验。以下内容翻译自作者的博客&#xff0c;查看原文TypeScript at Lyft。 在我刚刚成为JavaScript开发者的时候&…

【Python】Conda的安装

挖个坑&#xff0c;以后自己慢慢填&#xff1a;下载conda后无法使用 conda优势&#xff1a;conda将几乎所有的工具、第三方包都当做package对待&#xff0c;甚至包括python和conda自身&#xff01;因此&#xff0c;conda打破了包管理与环境管理的约束&#xff0c;能非常方便地…

C++描述杭电OJ 2014. 青年歌手大奖赛_评委会打分 ||

C描述杭电OJ 2014. 青年歌手大奖赛_评委会打分 || Problem Description 青年歌手大奖赛中&#xff0c;评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分&#xff0c;然后计算平均得分&#xff0c;请编程输出某选手的得分。 Input 输入数据有多组&#xff0c…

Java AIO 编程

转载自 java aio 编程 Java NIO (JSR 51)定义了Java new I/O API&#xff0c;提案2000年提出,2002年正式发布。 JDK 1.4起包含了相应的API实现。 JAVA NIO2 (JSR 203)定义了更多的 New I/O APIs&#xff0c; 提案2003提出&#xff0c;直到2011年才发布&#xff0c; 最终在JDK …

P1494-[国家集训队]小Z的袜子【分块优化莫队】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1494 题目大意 区间任意取两个数&#xff0c;求取到相同的数的概率。 解题思路 假设一个区间有x个y&#xff0c;那么两个都取到y的方案数是x∗(x−1)x*(x-1)x∗(x−1)&#xff0c;那么取到相同总共方…

通过Swashbukle给DotNet Core Web API 增加自动文档功能

DotNet Core Web API给开发者提供了一个很好的框架来开发Restful的API。那么这些API接口该如何管理起来呢&#xff1f;Swagger是一个很好的选择&#xff0c;Swagger不需要开发者额外去维护接口文档&#xff0c;只要开发者的接口遵循Restful的规范&#xff0c;Swagger就会根据AP…

【Python】urllib爬取动漫图片

首先附上需要爬取图片的网站&#xff0c;应该算是个冷门网站&#xff0c;够练手用的了&#xff0c;我的博客图片大部分来自于这里 二次元图片网站 筛选src里的数据 用par r’<img src"[^"].jpg">可以筛选出带有里面的内容 htmldasdas <img src"…

P4137-Rmq Problem/mex【莫队,分块】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP4137 题目大意 求区间mex。 解题思路 开始发现aia_iai​很大&#xff0c;开不了桶。但是转念一想&#xff0c;如果ans>n1ans>n1ans>n1仅当前n1个都有&#xff0c;可是最多只有n个&#xff…

【Python】字符串和变量拼接的写法

我的需求是改变url地址的后缀&#xff0c;其他不改&#xff0c;所以直接for循环&#xff0c;变换数字就行 也就是 字符串变量字符串 想着改变后缀就能批量爬图。但是原本的想法是错误的 for num in range(2,8):url"http://www.win4000.com/wallpaper_detail_160877_"…

Java面试,如何在短时间内做突击

转载自 Java面试&#xff0c;如何在短时间内做突击 面试技术文 Java岗 面试考点精讲&#xff08;基础篇01期&#xff09; Java岗 面试考点精讲&#xff08;基础篇02期&#xff09; Java岗 面试考点精讲&#xff08;网络篇03期&#xff09; Java 面试中遇到的坑 Java面试中…

【学校作业】学生数据打印

数据结构课程布置了一门c语言的结构体作业 要求&#xff1a; 五个学生&#xff0c;数据包括学号&#xff0c;姓名&#xff0c;3门课的成绩&#xff0c;从键盘输入5个学生的数据。打印出3门课总平均成绩&#xff0c;以及最高分 强迫症患者表示打印出的数据必须美观&#xff0c; …