以后必须学会面向数据编程!看半天题目不知道咋写直接爆搜,结果分少的可怜,还不如直接贪搞个60分。

观察数据,发现图至多存在一个环

显然,如果没有环,这个题不跟你多bb,直接贪就完事了,线性复杂度。

原因十分显然,一旦你还没走到底就往回走的话,就走不完整张图了。

有环的话,这题就是个基环树。

根据题意,小Y显然是不能走完一个环的,那就简单了,直接删边开搞。

参考代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 5010
#define MOD 2520
#define E 1e-12
using namespace std;
inline int read()
{
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int n,m;
vector<int> g[N],ans,tmp;
int stack[N],top;
bool v[N],vis[N][N],flag;
inline void upd()
{
for(int j=0;j<tmp.size();++j){
if(tmp[j]>ans[j]) break;
if(tmp[j]<ans[j]){
ans.clear();
for(int i=0;i<tmp.size();++i)
ans.push_back(tmp[i]);
}
}
tmp.clear();
}
inline void dfs2(int x,int fa)
{
tmp.push_back(x);
for(int i=0;i<g[x].size();++i){
int y=g[x][i];
if(y==fa||vis[x][y]) continue;
dfs2(y,x);
}
}
inline void dfs1(int x,int fa)
{
v[x]=1;stack[++top]=x;
for(int i=0;i<g[x].size();++i){
int y=g[x][i];
if(y==fa) continue;
if(v[y]){
int tmp=stack[top];
vis[tmp][y]=vis[y][tmp]=1;
dfs2(1,0);
vis[tmp][y]=vis[y][tmp]=0;upd();
while(tmp!=y){
int pre=stack[--top];
vis[tmp][pre]=vis[pre][tmp]=1;
dfs2(1,0);
vis[tmp][pre]=vis[pre][tmp]=0;
upd();tmp=pre;
}
for(int i=0;i<ans.size();++i)
printf("%d ",ans[i]);
exit(0);
}
else dfs1(y,x);top--;
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=m;++i){
int u=read(),v=read();
g[u].push_back(v),g[v].push_back(u);
}
for(int i=1;i<=n;++i) sort(g[i].begin(),g[i].end());
ans.push_back(INF);
dfs1(1,0);
if(!flag) dfs2(1,0);upd();
for(int i=0;i<ans.size();++i)
printf("%d ",ans[i]);
return 0;
}

P5022 旅行[基环树]的更多相关文章

  1. noip 2018 day2 T1 旅行 基环树 tarjan

    Code: #include<cstdio> #include<cstring> #include<string> #include<stack> #i ...

  2. 【题解】 P5022旅行

    [题解]P5022 旅行 当给定你一颗树的时候,这题就是一道送分题,凉心啊! 但是给定你一颗基环树呢? 暴力断环直接跑. 但是数据范围\(n\le 1000\) 乱做就完事了. 考场上这样想的,对于\ ...

  3. D4 树的直径、重心以及基环树

    第一题第二题鉴上我前几篇博客poj1985 poj1849:https://www.cnblogs.com/Tyouchie/p/10384379.html 第三题:数的重心:poj1655 来自sj ...

  4. P5022 旅行

    原题链接  https://www.luogu.org/problem/P5022 本着快csp了,做点往年的NOIp的题试试水来着,没想到水这么深 难度还挺大的,耗了我一天的时间(可能是我太菜了) ...

  5. 【BZOJ1791】【IOI2008】【基环树】island(status第一速度)

      1791: [Ioi2008]Island 岛屿  Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 908  Solved: 159 [Su ...

  6. 【BZOJ3531】旅行(树链剖分,线段树)

    [BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...

  7. B20J_3231_[SDOI2014]旅行_树链剖分+线段树

    B20J_3231_[SDOI2014]旅行_树链剖分+线段树 题意: S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,城市信仰不同的宗教,为了方便,我们用不同的正整数代表各种宗教. S国 ...

  8. 『Island 基环树直径』

    Island(IOI 2008) Description 你准备浏览一个公园,该公园由 N 个岛屿组成,当地管理部门从每个岛屿 i 出发向另外一个岛屿建了一座长度为 L_i 的桥,不过桥是可以双向行走 ...

  9. 【BZOJ4883】 [Lydsy1705月赛]棋盘上的守卫(最小生成树,基环树)

    传送门 BZOJ Solution 考虑一下如果把行,列当成点,那么显然这个东西就是一个基环树对吧. 直接按照\(Kruscal\)那样子搞就好了. 代码实现 代码戳这里

随机推荐

  1. win 10 禁用后置摄像头

    2.双摄像头电脑,甄别时默认开启的是后置摄像头,识别不到人脸. (1)更换设备参加甄别: (2)自行调整:停用电脑后置摄像头,停用后甄别时会默认调取前置摄像头: 以下操作适用于Windows surf ...

  2. 三个基于.net的浏览器内核使用的比较

    最近做模拟登陆发帖相关的项目 分别尝试了基于IE .NET自带的 webbrowser 和 基于WebKit 的WebKit.NET和openWebkitSharp 最开始肯定是用的.NET自带的we ...

  3. js密码加密

    1.base64加密:在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML> <html> <head> <meta charset ...

  4. Spring中Bean命名源码分析

    Spring中Bean命名源码分析 一.案例代码 首先是demo的整体结构 其次是各个部分的代码,代码本身比较简单,不是我们关注的重点 配置类 /** * @Author Helius * @Crea ...

  5. centos删除指定名称的进程

    vim kill_process.sh ----------------------------------- if [ "$1" = "" ]; then e ...

  6. AJAX -------------- 如何使用ajax

    AJAX  即“Asynchronous JavaScript and XML”(异步的JavaScript 与 XML技术 ),指的是一套综合了多项技术的浏览器端网页开发技术. 所谓为的异步交互:指 ...

  7. Java计算工作日的工具类

    有时候需要根据工作日计算指定的日期,也就是需要排除周六日. 1.  初版代码如下: package cn.xm.exam.utils; import java.util.Calendar; impor ...

  8. malloc,free,calloc,realloc函数

    malloc函数 原型:extern void* malloc(unsigned int size): 功能:动态分配内存: 注意:size仅仅为申请内存字节大小,与申请内存块中存储的数据类型无关,故 ...

  9. python基础知识的学习和理解

    参考链接:https://github.com/yanhualei/about_python/tree/master/python_learning/python_base   python基础知识笔 ...

  10. windows下隐藏磁盘分区(转)

    在一定情况下有的人会想隐藏掉部分分区,比如双系统的情况 有两种方式 方法1: 删除盘符,适合在双系统的情况下隐藏掉另外一个系统相关的分区 请注意是删除盘符 不是删除分区 此电脑右键管理 点击磁盘管理 ...