博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NOIp2018提高组]旅行
阅读量:7025 次
发布时间:2019-06-28

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

[NOIp2018提高组]旅行:

题目大意:

一个\(n(n\le5000)\)个点,\(m(m\le n)\)条边的连通图。可以从任意一个点出发,前往任意一个相邻的未访问的结点,或沿着第一次来这个点的边返回。需要遍历每一个点。没经过一个新的结点,就将这个结点写下来。最终可以得到一个序列。求字典序最小的序列。

思路:

对于树的情况,显然从\(1\)出发,每次从字典序最小的相邻结点DFS即可。

对于有环的情况,由于环只有一个,我们可以将环找出来,枚举删掉环上的每一条边,然后按树的情况求解即可。

时间复杂度\(\mathcal O(n^2)\)

源代码:

#include
#include
#include
#include
#include
#include
#include
inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x;}const int N=5001;struct Edge { int u,v;};Edge edge[N];std::vector
> g[N];bool vis[N],mark[N];std::stack
> stk;void dfs(const int &x,const int &par) { vis[x]=true; for(unsigned i=0;i
e[N];inline void add_edge(const int &u,const int &v) { e[u].insert(v); e[v].insert(u);}inline void del_edge(const int &u,const int &v) { e[u].erase(v); e[v].erase(u);}int s[N],ans[N];void solve(const int &x,const int &par) { s[++s[0]]=x; for(std::set
::iterator i=e[x].begin();i!=e[x].end();i++) { const int &y=*i; if(y==par) continue; solve(y,x); }}inline bool check(int a[],int b[],const int &n) { for(register int i=1;i<=n;i++) { if(a[i]
b[i]) return false; } return false;}int main() { const int n=getint(),m=getint(); for(register int i=0;i

转载于:https://www.cnblogs.com/skylee03/p/9961821.html

你可能感兴趣的文章
NGUI v301 官网详解 Example 3 - Menu
查看>>
android手机杀毒
查看>>
抽象工厂模式——创建型模式
查看>>
局域网共享文件读写的实现方式
查看>>
Mac OS X安装cocoapods及使用详解
查看>>
iOS开发网络篇—JSON介绍
查看>>
centos7最小化安装
查看>>
网页检测摇一摇
查看>>
2013-9-11
查看>>
使用 Jersey 和 Apache Tomcat 7 构建 JAX-RS 环境
查看>>
正则的部分表达式(转载)
查看>>
hql查询
查看>>
模仿酷狗7(Kugou7)音乐魔方界面源码
查看>>
剑指offer之字符串是否为数值
查看>>
我的友情链接
查看>>
HTTP Cookie 详解
查看>>
Apache与PHP的结合配置、Apache默认虚拟主机
查看>>
Lab4-CUCM PUB First Configuration
查看>>
关于MS12-020 3389 0day exp 远程桌面执行代码漏洞的文章
查看>>
既然入了IT这行得不停的学习,不进则退
查看>>