NOIP2019 旅行
注意!注意!前方高能!本题卡常!!!
我们发现,所有的狗血剧情都在告诉我们,树的话直接dfs就出来了
那么基环树呢?
其实只要暴力删边,理论上的复杂度是可以过的qwq
但是删哪条边呢?
这里要引出一个基环树的常用操作:拓扑排序求环。具体方法是:在基环树上拓扑排序,然后拓扑序列中不存在的节点就是环中的节点了。
最后要用到环中的边的时候有一个小技巧,就是存边的时候(我用的是邻接表存双向边)按
input(x,y,z);
if(x>y) swap(x,y);
add(x,y,z);add(y,x,z);
的顺序存。
这样找边去重的时候就比较好找。。。(我也表述不太明白,具体看代码吧~)
Code
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N = 1e5+1;
int n,m,r[N];
int h[N],cnt,delu,delv;//假装 del_u-v 这条边已经被删去了qwq
struct edge
{
int nxt;
int to;
}e[N];
int ans[N],ans1[N];
int qh=0,qt=1,qtp[N],tp[N],vis[N],visu[N],visv[N],tpcnt;//巨丑的代码qwq
inline void readx(int &x)
{
x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+ch-48;ch=getchar();}
}
inline void add(register int u,register int v)
{
e[++cnt].nxt=h[u];
e[cnt].to=v;
h[u]=cnt;
}
inline void topo()
{
for(register int i=1;i<=n;++i) vis[i]=1;
for(register int u=1;u<=n;++u)
{
for(register int i=h[u];i;i=e[i].nxt)
{
register int v=e[i].to;
++tp[u];++tp[v];
}
}
for(register int i=1;i<=n;++i) if(tp[i]==2) qtp[qt++]=i;
// for(int i=1;i<=n;++i) printf("%d ",qtp[i]);printf("\n");
while(qt>qh)
{
register int u=qtp[++qh];vis[u]=0;
for(register int i=h[u];i;i=e[i].nxt)
{
register int v=e[i].to;
tp[u]-=2;tp[v]-=2;
if(tp[v]==2&&vis[v]) qtp[qt++]=v;
}
}
for(register int u=1;u<=n;++u)
if(vis[u]==1)
{
for(register int i=h[u];i;i=e[i].nxt)
{
register int v=e[i].to;
if(vis[v]==1&&u<v)
{
visu[++tpcnt]=u;visv[tpcnt]=v;
}
}
}
}
inline void update()
{
for(register int i=1;i<=n;++i)
{
if(ans1[i]==ans[i]) continue;
if(ans[i]==0) {for(register int j=1;j<=n;++j) ans[j]=ans1[j];return;}
if(ans1[i]>ans[i]) return;
//ans1[i]<ans[i]
for(register int j=i;j<=n;++j) ans[j]=ans1[j];return;
}
}
inline void dfs(register int u,register int fa)
{
ans1[++cnt]=u;
priority_queue <int,vector<int>,greater<int> > q;//小根堆
for(register int i=h[u];i;i=e[i].nxt)
{
register int v=e[i].to;
if(v==fa||(u==delu&&v==delv)||(u==delv&&v==delu)) continue;
q.push(v);
}
while(!q.empty())
{
register int v=q.top();q.pop();
dfs(v,u);
}
}
signed main()
{
readx(n);readx(m);
for(register int i=1;i<=m;++i)
{
int u,v;readx(u);readx(v);
if(u>v) swap(u,v);
add(u,v);add(v,u);
}
cnt=0;
if(m==n-1)
{
dfs(1,0);
for(register int i=1;i<=n;++i) ans[i]=ans1[i];
}
else
{
topo();
for(register int i=1;i<=tpcnt;++i)
{
cnt=0;
delu=visu[i];delv=visv[i];
dfs(1,0);
update();
}
}
for(register int i=1;i<=n;++i)
printf("%d ",ans[i]);
return 0;
}
其实代码也就是看106行到107行那里,别的地方写得太丑了没法看,而且自己基本能写出来,加油哦qwq!
NOIP2019 旅行的更多相关文章
- 【NOIP2019模拟2019.11.13】旅行 && GDKOI2018 还念(二分答案+dij)
Description: 题解: 显然满足二分性. 并且每一条边要不选l要不选r. 二分的那条链肯定要选l. 考虑有两个人在走最短路,一个人一开始必须走二分的那条链,要求第一个人走的比第二个人快. 安 ...
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- vijos P1780 【NOIP2012】 开车旅行
描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...
- 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流
1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 388 Solved: 212[Submit ...
- codevs 1036 商务旅行(Targin求LCA)
传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...
- nyoj 71 独木舟上的旅行(贪心专题)
独木舟上的旅行 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...
- 【bzoj3531】 [SDOI2014]旅行
题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...
- tomcat源码分析(三)一次http请求的旅行-从Socket说起
p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...
- 11.14 T2 小x的旅行(小x的旅行)
1.小x的旅行 (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...
随机推荐
- 谁说程序员没有时间关心女朋友的,Python 教你如何掌握女神情绪变化
很多人都是在朋友圈装死,微博上蹦迪.微信朋友圈已经不是一个可以随意发表心情的地方了,微博才是! 所以你不要傻傻盯着女神的朋友圈发呆啦!本文教你如何用 Python 自动通知女神微博情绪变化,从今天开始 ...
- Coursera-吴恩达机器学习课程笔记-Week1
参考资料: 吴恩达教授机器学习课程 机器学习课程中文笔记 Week 1 一. 引言 机器学习模型可分为监督学习Superviese learning(每个数据集给出了正确的值)和无监督学习Unsupe ...
- National Contest for Private Universities (NCPU), 2019 C Boxes(双向链表)
题目中的要求如果x在y的左边,不需要移动,x在y的右边,2操作不需要移动. 有一个问题是,如果x与y相邻,这时的swap操作变成了三个而不是四个,这点尤其需要注意,不然就会死循环.注意x是和y相邻,这 ...
- thinkphp 连接webservice接口
嗯,我现在真的好像骂人啊,但是我又是个文明的人,所以我就写出来让自己冷静一下 ok,正事,thinkphp连别人写的webservice接口 刚开始他叫什么nc接口,就把我给骗了,这就是人家的名字,和 ...
- 在linux下安装java(centos和ubuntu)
在本地测试环境安装插件,发现还得用到java,虽说是个程序员,可是没用过java啊,哎,但是插件得用啊,怎么办啊?自己装呗 一.自己的系统:CentOS 7 1.查看CentOS自带JDK是否已安装. ...
- Go语言基础之rand(随机数)包
在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand", 对应两种应用场景. "math/rand ...
- ZOJ - 3203 Light Bulb(三分)
题意:灯离地面的高度为$H$,人的身高为$h$,灯离墙的距离为$D$,人站在不同位置,影子的长度不一样,求出影子的最长长度. 思路:设人离灯的距离为$x$,当人走到距离灯长度为$L$时,人在墙上的影子 ...
- zabbix4.4安装和简要设置
简介 Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.它能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决 ...
- Kakfa概述及安装过程
一.概述 1. Kafka是由LinkedIn(领英)开发的一个分布式的消息系统,最初是用作LinkedIn的活动流(Activity Stream)和运营数据处理的基础 a. 活动流数据包括页面访问 ...
- 数据结构--Java语言描述
本篇文章是为了记录自己在学习数据结构时的笔记,会对常见的数据结构做基本的介绍以及使用Java语言进行实现.包括 动态数组 栈 队列 链表 二分搜索树 优先队列和堆 线段树 Trie树 并查集 AVL树 ...