[NOIP2018]旅行(数据加强版)(图论+基环树)
数据范围多了2个0就是不一样,O(n^2)只能68分了。(其中60分是n=m+1和原题一样的做法送的),这题直接从NOIP难度变为NOI Plus难度了
不说废话直接写题解:
首先dfs一遍找到环,然后和n=m+1一样从1号点访问,然后跑到环以后,对于环上的点,可以执行仅一次返回到第一次到达环上的点的操作。所以dfs记录的时候记录下次访问的点就可以,因为退回操作后只要退回途中下面有点,那么就必须访问,讨论一下退回途中访问的第1个点,比较其余环上下一个点的大小就行了。注意dfs时要打标记(否则可能会有锅)。
注意:数据有毒,要写读入优化+适当卡常数X过去(没写读优被卡成96的我),最后运行时间最长的932ms通过,如果多交几次发现还有没通过的时候(不管了)
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+;
int n,m,top,k,cnt,cut,a[N],b[N],cir[N],s[N],g[N],vis[N];
vector<int>v[N];
inline int read()
{
int x=,w=;
char ch=;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while(isdigit(ch))x=(x<<)+(x<<)+(ch^),ch=getchar();
return w?-x:x;
}
void dfs(int u,int fa)
{
a[++top]=u;
for(int i=;i<v[u].size();++i)if(v[u][i]!=fa)dfs(v[u][i],u);
}
void getcir(int x,int fa)
{
s[++top]=x;
vis[x]=;
int sz=v[x].size();
for(int i=;i<sz;++i)
if(v[x][i]!=fa)
{
if(vis[v[x][i]])
{
k=;
while(s[top]!=v[x][i])g[++cnt]=s[top--];
g[++cnt]=v[x][i];
return;
}
getcir(v[x][i],x);
if(k)return;
}
vis[s[top--]]=;
}
void dfs2(int x,int k,int fa)
{
a[++top]=x,vis[x]=;
int sz=v[x].size()-;
for(int i=;i<=sz;++i)b[i]=v[x][i];
v[x].clear();
for(int i=;i<=sz;++i)
if(!vis[b[i]])v[x].push_back(b[i]);
sz=v[x].size()-;
for(int i=;i<=sz;++i)
if(!vis[v[x][i]])
{
if(i==sz&&cir[v[x][i]]&&!cut&&v[x][i]>k&&cir[fa]){cut=;return;}
if(i<sz-)dfs2(v[x][i],v[x][i+],x);
else if(i==sz)dfs2(v[x][i],k,x);
else{
int y=i+;
if(cir[v[x][y]]&&!cut&&v[x][y]>k&&cir[fa])dfs2(v[x][i],k,x);
else dfs2(v[x][i],v[x][y],x);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x,y;i<=m;i++)v[x=read()].push_back(y=read()),v[y].push_back(x);
for(int i=;i<=n;i++)sort(v[i].begin(),v[i].end());
if(m==n-)
{
dfs(,);
for(int i=;i<=n;i++)printf("%d ",a[i]);
}
else{
getcir(,);
for(int i=;i<=cnt;i++)cir[g[i]]=;
top=;
memset(vis,,sizeof vis);
dfs2(,n+,);
for(int i=;i<=n;i++)printf("%d ",a[i]);
}
}
[NOIP2018]旅行(数据加强版)(图论+基环树)的更多相关文章
- P5049 旅行(数据加强版)(基环树)
做法 把环找出来,如果在环上(u,v)两点的时候,u的其他子树都走完了,v上第一个还有除v存在的子树没走完的 祖先,祖先的最小子节点小于v,则回去 Code #include<bits/stdc ...
- BZOJ 2594 水管局长数据加强版(动态树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2594 题意:给出一个无向图,边有权值.定义一条路径的长度为该路径所有边的最大值.两种操作 ...
- LuoguP5022 旅行 (割点,基环树)
// luogu-judger-enable-o2 #include <cstdio> //#include <iostream> #include <cstring&g ...
- 洛谷P5022&P5049 旅行(及其数据加强版)
旅行(不是加强版) 加强版 加强版数据范围: 我们注意到 也就是说要么是个树,要么是个基环树 60pts 这60分是个树,可以简单的贪心想到每次都走子树中编号最小的那个,并且把1作为根 dfs练手题 ...
- bzoj 2594: [Wc2006]水管局长数据加强版 动态树
2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 934 Solved: 291[Submit][Sta ...
- 与图论的邂逅01:树的直径&基环树&单调队列
树的直径 定义:树中最远的两个节点之间的距离被称为树的直径. 怎么求呢?有两种官方的算法(不要问官方指谁我也不晓得): 1.两次搜索.首先任选一个点,从它开始搜索,找到离它最远的节点x.然后从x开始 ...
- P5022 旅行[基环树]
以后必须学会面向数据编程!看半天题目不知道咋写直接爆搜,结果分少的可怜,还不如直接贪搞个60分. 观察数据,发现图至多存在一个环. 显然,如果没有环,这个题不跟你多bb,直接贪就完事了,线性复杂度. ...
- [JZOJ 5905] [NOIP2018模拟10.15] 黑暗之魂(darksoul) 解题报告 (拓扑排序+单调队列+无向图基环树)
题目链接: http://172.16.0.132/senior/#main/show/5905 题目: oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰 ...
- 【洛谷P5049】旅行(数据加强版)
题目链接 m=n-1是直接按字典序dfs就行, m=n时是一棵基环树,我们发现当一个点在环上时,可以把它和它的一个在环上的儿子之间的边删掉,然后回溯,到达它的第一个有其他儿子的祖先的另一个儿子上,我们 ...
随机推荐
- mysql 中出现:不能打开到主机的连接,在端口3306: 连接失败
由于某种原因,在服务器部署,然后mysql就连接不上了, navicat查看数据库正常,telnet怎么都不同,总会卡一会儿说遗失主机,最后终于找到解决办法 http://www.51testing. ...
- Saltstack 安装与常用模块
一.介绍 saltstack是基于C/S服务模式,在该架构中,服务器端叫做Master,客户端叫做Minion.传统的C/S模式我们这样理解,客户端发送请求给服务器端,服务器端接受到来自客户端的请求并 ...
- vue ajax
局部get: this.$http.get(url,{param:jsonData}).then(successCallback,failCallBack) 局部post: this.$http.po ...
- Java反射和注解
反射:http://blog.csdn.net/liujiahan629629/article/details/18013523 注解:http://www.cnblogs.com/peida/arc ...
- Django实现Rbac权限管理
权限管理 权限管理是根据不同的用户有相应的权限功能,通常用到的权限管理理念Rbac. Rbac 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问, ...
- 将一个字符(char)或者一个整形(int)的二进制形式输出
要输出一个数的二进制形式使用位操作 >> 和 & void putBinary(int number)//将一个int整形数字的二进制形式正序,倒序输出 { int value; ...
- Codeforces Round #518 (Div. 2) B. LCM gcd+唯一分解定律
题意:给出b 求lcm(a,b)/a 在b从1-1e18有多少个不同得结果 思路lcm*gcd=a*b 转换成 b/gcd(a,b) 也就是看gcd(a,b)有多少个值 可以把b 由唯一分解 ...
- 洛谷P1118数字三角形题解
题目 这个题我们乍一看会有些熟悉.觉得是可以用DP来做的那个题.但是打眼一看,就会发现不对了.因为那个题是顺推而这个题则是逆推. 这样的话可怎么办呢. 我们可以在草稿纸上推一下,我们随便写个数n. 再 ...
- 【XSY2727】Remove Dilworth定理 堆 树状数组 DP
题目描述 一个二维平面上有\(n\)个梯形,满足: 所有梯形的下底边在直线\(y=0\)上. 所有梯形的上底边在直线\(y=1\)上. 没有两个点的坐标相同. 你一次可以选择任意多个梯形,必须满足这些 ...
- 洛谷CF1071E Rain Protection(计算几何,闵可夫斯基和,凸包,二分答案)
洛谷题目传送门 CF题目传送门 对于这题,我无力吐槽. 虽然式子还是不难想,做法也随便口胡,但是一些鬼畜边界情况就是判不对. 首先显然二分答案. 对于每一个雨滴,它出现的时刻我们的绳子必须落在它上面. ...