正题

评测记录: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]);
}

P5022-旅行【基环树,dfs】相关推荐

  1. 数据结构之基环树——骑士,Island,旅行加强版,Number of Simple Paths,Traffic Network in Numazu,Card Game

    文章目录 [ZJOI2008]骑士 [IOI2008] Island [NOIP2018 提高组] 旅行 加强版 CF1454E Number of Simple Paths Traffic Netw ...

  2. 【基环树DP】[NOI2012]迷失游乐园

    题目描述 Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多 ...

  3. CodeForces - 1454E Number of Simple Paths(基环树+思维)

    题目链接:点击查看 题目大意:给出一棵 n 个点的基环树,现在需要求所有长度大于等于 1 的路径个数 题目分析:对于所有的路径 ( x , y ) 可以分成下列两种情况来考虑: 路径不会经过环上的边: ...

  4. CodeForces - 1252L Road Construction(基环树+有源汇有上下界的最大流)

    题目链接:点击查看 题目大意:给出 n 个节点,再给出 n 个出边,保证所有的边能将 n 个点连通,每条出边可以用 m[ i ] 种材料选择其一建造,然后有 k 个工人,每个工人只可以使用一种材料建造 ...

  5. 基环树一些有趣的事情

    基环树,就是有一个环的树.有向基环树又分内向和外向基环树,当然也有无向的. 最近遇到的基环树真不少.有些题目赤裸裸的就告诉你,"给出一棵基环树(环套树)",但是有的题会有一些标志. ...

  6. Codeforces Round #686 (Div. 3) E. Number of Simple Paths 基环树 + 容斥

    传送门 文章目录 题意: 思路: 题意: 给你一颗基环树,求长度>=1>=1>=1的路径个数. 思路: 先考虑一棵树,他的答案显然是n∗(n−1)2\frac{n*(n-1)}{2} ...

  7. 【NOI2012】迷失游乐园【概率期望】【换根dp】【基环树】

    传送门 题意:给一棵nnn个点的带边权树或基环树,随机选一个点作为起点,每次随机走到一个相邻未走过的位置,直到无路可走.求期望路径长度. n≤105n \leq 10^5n≤105,为基环树时环的大小 ...

  8. 【NOI2013】快餐店【基环树】【树的直径】【set】

    传送门 题意:给一棵nnn个点的基环树,找一个点(可以在边上),求所有节点到这个点的最大值的最小值. n≤1e5n \leq1e5n≤1e5 先考虑一棵普通树的情况 显然是直径长度的一半 因为如果有个 ...

  9. ARC079F - Namori Grundy(构造,基环树)

    ARC079F - Namori Grundy Solution 首先这是一个NNN个点NNN条边的有向图,所以它的基图是一棵基环树,其次这个图的所有点入度为111,因此这是一棵基环外向树. 然后对于 ...

最新文章

  1. ubuntu mysql的穷_Ubuntu安装配置Mysql
  2. Bootstrap的坑--千万别踩
  3. keil C 51 strlen库函数使用
  4. Linux C语言调用C++动态链接库
  5. Codeforces Round #722 (Div. 2)
  6. [LeetCode] Maximal Rectangle
  7. [CSAcademy]Cycle Tree
  8. 全球首发!惯性导航导论(剑桥大学)第十二部分
  9. 如何将多个Excel合并到一个Excel中?
  10. 蓝桥杯---2012--比酒量(暴力)
  11. Eclipse 插件 在线安装 收集
  12. python绘制动态心电图_长时动态心电图ECG数据可视化
  13. Android JNI的调用过程
  14. 三菱plc pwm指令_【三菱PLC指令教程】定时器指令应用之时序图编程法(一)
  15. ROM、RAM、DRAM、SRAM、SDRAM区别及特点
  16. 用VS新建多层架构时引用第三方dll 时清理解决方案时,放bin文件夹下的bll被清空问题
  17. 【Pigeon源码阅读】RPC底层通信实现原理(八)
  18. better-scroll滚动的同时样式透明度发生变化
  19. 极客日报:微信自动抢红包软件被判赔 475 万;日本科学家打破网速全球纪录;JavaScript蝉联最受欢迎编程语言
  20. mysql double 使用_mysql double类型使用与主键自增

热门文章

  1. c语言分配多一个字符空间,关于C语言动态给字符串分配内存空间问题
  2. linux 取消证书登录密码,SUSELinux 中为 SSH 访问设置不输入密码的证书认证登录方式...
  3. mysql rpm 安装后修改路径_mysql rpm包安装后修改数据目录
  4. c++ 多重背包状态转移方程_【考前再叮嘱】陌生方程式书写
  5. node.js require 自动执行脚本 并生成html,nodejs 执行脚本并实时输出
  6. java实用教程——组件及事件处理——ItemEvent事件(设置字体类型)
  7. 宝塔部署node项目_宝塔面板部署 node.js 项目
  8. Java面向对象编程(高级)
  9. KMP模式串匹配+Compress Words CodeForces - 1200E
  10. c语言火车票管理系统源代码2000行,C语言教务管理系统[2000行代码].doc