旅行

标签(空格分隔): noip2018 提高组


今天我给大家带来一份题解。

题目的大大致意思是这样的:

$$ 有一颗 树/基环树 求最小遍历顺序 $$

树的情况自然不必多讲。做一些末端的微处理(将每个点的邻接点排序)即可。

而基环树呢?这是我们就要普及一下基环树的知识了。

\[基环树,简单来讲,就是在一棵树上连一条边,构成一个环。
\]

SO

如何处理??

来,边看代码边讲!

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e3+5;
int n,m,x,y,dep;
vector <int> e[maxn]; //ling'jie'biao'cun'bian
int tmp[maxn],ans[maxn],cnt,rd[maxn];
bool Tre[maxn],vis[maxn],done[maxn][maxn];
struct edge{
int x,y;
}del;
void dfs(int pos){
if(dep>n)return;
tmp[dep]=pos;vis[pos]=1;
for(int i=0;i<e[pos].size();i++){
int next=e[pos][i];
if((del.x == pos && del.y == next) || (del.x == next && del.y == pos))
continue;
if(!vis[next]){
vis[next]=1;
dep++;
dfs(next);
}
}
}
void top(){
queue<int>q;
for(int i=1;i<=n;i++){
if(rd[i]==1){
Tre[i]=1;
rd[i]--;
q.push(i);
}
}
while(!q.empty()){
int x=q.front();q.pop();
Tre[x]=1;
for(int j=0;j<e[x].size();j++){
int y=e[x][j];
rd[y]--;
if(rd[y]==1){
q.push(y);
}
}
}
return ;
}
bool check(){
for(int i=1;i<=n;i++){
if(ans[i] == tmp[i]){
continue;
}
if(ans[i] < tmp[i]){
return false;
}
if(ans[i] > tmp[i]){
return true;
}
}
}
void update(){
if(ans[1]==0){
for(int i=1;i<=n;i++){
ans[i]=tmp[i];
}
}
else if(check()){
for(int i=1;i<=n;i++){
ans[i]=tmp[i];
}
}
}
void out(){
for(int i=1;i<=n;i++){
printf("%d ",ans[i]);
}
return ;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
e[x].push_back(y);rd[y]++;
e[y].push_back(x);rd[x]++;
}
for(int i=1;i<=n;i++){
sort(e[i].begin(),e[i].end());
}
if(m == n-1){
dep = 1;
Tre[1]=true;
dfs(1);
update();
}
else {
top();
for(int i=1;i<=n;i++){
if(!Tre[i]){
for(int j=0;j<e[i].size();j++){
if(!Tre[e[i][j]]){
del.x = i;
del.y = e[i][j];
if(done[del.x][del.y]){
continue;
}
done[del.x][del.y]=done[del.y][del.x]=1;
memset(vis,0,sizeof(vis));
vis[1]=true;dep=1;dfs(1);
update();
}
}
}
}
}
out();
return 0;
}

LGOJ5022 旅行 noip tg 2018的更多相关文章

  1. 开车旅行 [NOIP 2012]

    Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i的海拔高度为Hi,城市 i ...

  2. 【NOIP TG 解方程】

    存代码: #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> ...

  3. noip训练 2018.10.22~2018.10.23

    day1 100+100+0=200 T1 稍微比划一下,发现其实就是缩点双,然后区间最小值的和 T2 发现答案为原lis|+1|-1 对每个点做从前最长上升序列以及从后最长下降序列, 想了半个小时怎 ...

  4. [NOIP2018 TG D2T1]旅行

    题目大意:$NOIP\;TG\;D2T1$ 题解:一棵树的很简单,第一个点一定是$1$,只需要对每个节点,找最小的没有访问过的节点访问即可,我写的是$O(n\log_2n)$. 考虑基环树的部分,一个 ...

  5. 历年真题 未完成(Noip 2008 - Noip 2017)

    Noip 2008 :全部 Noip 2009 :全部 Noip 2010 :AK Noip 2011 :AK Noip 2012 : Vigenère 密码,国王游戏,开车旅行 Noip 2013 ...

  6. NOIP赛前集训备忘录(含每日总结)(日更?。。。)

    NOIP赛前集训备忘录(含每日考试总结) 标签: 有用的东西~(≧▽≦)/~啦啦啦 阅读体验:https://zybuluo.com/Junlier/note/1279194 考试每日总结(这个东西是 ...

  7. WC2019 20天训练

    Day -1 2019.1.2 初步计划: 0x60 图论 std 洛谷提高剩余练习 NOIP2018遗留题解 洛谷省选基础练习 数学: 1.数论 2.组合数学(练习:莫比乌斯反演) 3.概率(练习: ...

  8. 【基础练习】【区间DP】codevs1090 加分二叉树题解

    2003 NOIP TG 题目描写叙述 Description 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),当中数字1,2,3,-,n为节点编号.每一个节点都有一个分数(均为正整 ...

  9. CSP2019知识点整理

    也算是接下来二十天的复习计划吧 仅止于联赛难度左右 基础算法 字符串 char[] cstring memset() 输入无& gets(), fgets(stdin, ,); strcmp, ...

随机推荐

  1. Linux服务器部署redis常见问题处理

    redis开启和禁用登陆密码校验 1. 开启登陆密码校验 在redis-cli命令行工具中执行如下命令: config set requirepass yourpassword2. 禁用登陆密码校验 ...

  2. 【论文阅读】分布一致性算法Paxos 《The Part-Time Parliament》

    论文原文.翻译稿.PPt:https://1drv.ms/u/s!Ak-jGl23kTuMimOZzV-MyLQUYmsN?e=DL1xHD

  3. CodeForces 1408I Bitwise Magic

    题意 给定三个整数 \(n,k,c\) 和一个长度为 \(n\) 的序列 \(a\),保证 \(a_i\) 互不相同.可以操作 \(k\) 次,每次随机选择一个 \(a_i\) 变成 \(a_i-1\ ...

  4. Redis学习五(Redis 阻塞的原因及其排查方向).

    一.慢查询 因为 Redis 是单线程的,大量的慢查询可能会导致 redis-server 阻塞,可以通过 slowlog get n 获取慢日志,查看详情情况. 二.bigkey 大对象 bigke ...

  5. C#4语法新特性

    C#4,.NET Framework 4.0, Visual Studio 2010  C#4.0新引进的语法基于.Net Framework 4.0.主要引进的语法:动态类型,命名参数.可选参数,优 ...

  6. 关于synchronized无法锁住Integer原因

    原因 在多线程的时候,为了保证数据安全,必须在修改数据时使用线程同步,java中的synchronized用来实现线程同步.线程列队. 学完多线程基础的我,写一个多线程交替输出1,2,3,4,5... ...

  7. SpringCloud之Gateway

    一.为什么选择SpringCloud Gateway而不是Zuul? Gateway和Zuul的职责一样,都承担着请求分发,类似Nginx分发到后端服务器. 1.SpingCloud Gateway ...

  8. 「SHOI2014」三叉神经树

    「SHOI2014」三叉神经树 给你一颗由\(n\)个非叶子结点和\(2n+1\)个叶子结点构成的完全三叉树,每个叶子结点有一个输出:\(0\)或\(1\),每个非叶子结点的输出为自己的叶子结点中较多 ...

  9. 【Kata Daily 191012】Find numbers which are divisible by given number

    题目: Complete the function which takes two arguments and returns all numbers which are divisible by t ...

  10. canvas基础[二]教你编写贝塞尔曲线工具

    贝塞尔曲线 bezierCurveTo 在线工具 https://canvature.appspot.com/ [感觉这个好用一些] https://blogs.sitepointstatic.com ...