发现 \(m\) 只有两种取值,于是可做了

树的直接贪心

图的枚举环上的边去掉,然后做树的贪心,搜的时候剪一下枝吧

写得有点乱

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
#define ft first
#define sd second
#define pb(a) push_back(a)
#define mp(a,b) std::make_pair(a,b)
#define REP(a,b,c) for(register int a=(b),a##end=(c);a<=a##end;++a)
#define DEP(a,b,c) for(register int a=(b),a##end=(c);a>=a##end;--a)
const int MAXN=5000+10;
int n,m,e=1,key,beg[MAXN],nex[MAXN<<1],to[MAXN<<1],was[MAXN<<1],cnt,dfn[MAXN],ans[MAXN],vis[MAXN],arv[MAXN];
std::vector<int> V[MAXN];
std::pair<int,int> ext,from[MAXN];
struct Unique{
int fa[MAXN];
inline void init(int x)
{
REP(i,1,x)fa[i]=i;
}
inline int found(int x)
{
if(fa[x]!=x)fa[x]=found(fa[x]);
return fa[x];
}
inline int link(int x,int y,int val)
{
int u=found(x),v=found(y),res=0;
if(u!=v)fa[u]=v,res=val;
return res;
}
};
Unique U;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline bool chkmin(T &x,T y){return y<x?(x=y,true):false;}
template<typename T> inline bool chkmax(T &x,T y){return y>x?(x=y,true):false;}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void insert(int x,int y,int z)
{
to[++e]=y;
nex[e]=beg[x];
beg[x]=e;
was[e]=z;
}
inline void sortdfs(int x,int f)
{
if(arv[x])return ;arv[x]=1;
for(register int i=beg[x];i;i=nex[i])V[x].pb(to[i]),sortdfs(to[i],x);
std::sort(V[x].begin(),V[x].end());
}
inline void initdfs(int x,int f)
{
for(register int i=beg[x];i;i=nex[i])
if(to[i]==f||!was[i])continue;
else initdfs(to[i],x),from[to[i]]=mp(x,i);
}
inline bool dfs(int x,int f,int &fl)
{
dfn[++cnt]=x;
if(dfn[cnt]<ans[cnt])chkmin(fl,0);
if(fl&&dfn[cnt]>ans[cnt])return false;
int lack=-1;
for(register int i=beg[x];i;i=nex[i])
if(to[i]==f)continue;
else if(!was[i])lack=to[i];
REP(i,0,V[x].size()-1)
if(V[x][i]==lack||V[x][i]==f)continue;
else if(!dfs(V[x][i],x,fl))return false;
return true;
}
inline int LCA(int u,int v)
{
while(u)vis[u]=1,u=from[u].ft;
while(v)
if(vis[v])return v;
else v=from[v].ft;
}
inline void solve(int x)
{
int fl;
while(x!=key)
{
was[from[x].sd]=was[from[x].sd^1]=0;
cnt=0;if(dfs(1,0,fl=1))memcpy(ans,dfn,sizeof(ans));
was[from[x].sd]=was[from[x].sd^1]=1;
x=from[x].ft;
}
}
int main()
{
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
read(n);read(m);
U.init(n);int fl;
REP(i,1,n)ans[i]=n+1;
REP(i,1,m)
{
int u,v;read(u);read(v);
if(U.link(u,v,1))insert(u,v,1),insert(v,u,1);
else ext=mp(u,v);
}
if(m==n-1)sortdfs(1,0),dfs(1,0,fl=1),memcpy(ans,dfn,sizeof(ans));
else
{
initdfs(1,0);
insert(ext.ft,ext.sd,0);
insert(ext.sd,ext.ft,0);
sortdfs(1,0);
dfs(1,0,fl=1),memcpy(ans,dfn,sizeof(ans));
was[e]=was[e-1]=1;
key=LCA(ext.ft,ext.sd);
solve(ext.ft),solve(ext.sd);
}
REP(i,1,n)write(ans[i],i==iend?'\n':' ');
return 0;
}

【比赛】NOIP2018 旅行的更多相关文章

  1. 【LG5022】[NOIP2018]旅行

    [LG5022][NOIP2018]旅行 题面 洛谷 题解 首先考虑一棵树的部分分怎么打 直接从根节点开始\(dfs\),依次选择编号最小的儿子即可 而此题是一个基环树 怎么办呢? 可以断掉环上的一条 ...

  2. 竞赛题解 - NOIP2018 旅行

    \(\mathcal {NOIP2018} 旅行 - 竞赛题解\) 坑还得一层一层的填 填到Day2T1了 洛谷 P5022 题目 (以下copy自洛谷,有删减/修改 (●ˇ∀ˇ●)) 题目描述 小 ...

  3. NOIP2018 旅行 和 赛道修建

    填很久以前的坑. 旅行 给一棵 n 个点的基环树,求字典序最小的DFS序. n ≤ 5000 题解 O(n2) 做法非常显然,枚举断掉环上哪条边然后贪心即可.当然我去年的骚操作只能得88分. O(n ...

  4. [NOIP2018]:旅行(数据加强版)(基环树+搜索+乱搞)

    题目描述 小$Y$是一个爱好旅行的$OIer$.她来到$X$国,打算将各个城市都玩一遍.小$Y$了解到,$X$国的$n$个城市之间有$m$条双向道路.每条双向道路连接两个城市.不存在两条连接同一对城市 ...

  5. NOIP2018旅行

    这道题考场上的时候暴力写RE了,我果然很菜. 看了一篇大佬的的题解才明白 dalao的题解 但是解释很少哇,为了造福人类,在下发一篇详细一点的题解. 预处理:用vector把与每个点相连的点存起来,排 ...

  6. luogu5022 [NOIp2018]旅行 (dfs)

    m=n-1的时候,就直接贪心地dfs就可以 m=n的话,就可以枚举删掉一条边,然后照着m=n-1做 $O(n^2)$大概能过 (然而我眼瞎看不到m<=n) #include<cstdio& ...

  7. [NOIP2018]旅行(数据加强版)(图论+基环树)

    数据范围多了2个0就是不一样,O(n^2)只能68分了.(其中60分是n=m+1和原题一样的做法送的),这题直接从NOIP难度变为NOI Plus难度了不说废话直接写题解:首先dfs一遍找到环,然后和 ...

  8. [NOIP2018]旅行

    嘟嘟嘟 鉴于一些知道的人所知道的,不知道的人所不知道的原因,我来发NOIPday2T1的题解了. \(O(n ^ 2)\)的做法自然很暴力,枚举断边断环为链就行了. 所以我是来讲\(O(nlogn)\ ...

  9. 【题解】NOIP2018 旅行

    题目戳我 \(\text{Solution:}\) 首先题目描述有一点不准确:回头是必须要走完一条路无路可走的时候才能返回. 对于树的情况:显然贪心做就完事了. 对于基环树的情况:对于一个\(n\)条 ...

随机推荐

  1. 使用publisher模式控制频繁的UI输出,避免Winform界面假死

    http://www.cnblogs.com/Charltsing/p/publisher.html 最近测试task并发任务的效率与线程池的区别,发现了另外一个问题.task建立任务的速度很快,输出 ...

  2. java得到日期相减的天数

    /** * <li>功能描述:时间相减得到天数 * @param beginDateStr * @param endDateStr * @return * long * @author A ...

  3. Hadoop01的主要总结

    Hadoop (离线) 分布式的计算框架 scala---spark(实时计算框架)

  4. Java 常见编码格式——URL、Base64

    数据编码 我们对数据进行编码是因为在某些情况下,不能直接传输中文字符或者其他字符,比如在设置http协议的头部信息或者cookie时,如果value有中文字符,那么就需要将中文字符使用某种编码方式进行 ...

  5. 爬虫——scrapy框架

    Scrapy是一个异步处理框架,是纯Python实现的爬虫框架,其架构清晰,模块之间的耦合程度低,可拓展性强,可以灵活完成各种需求.我们只需要定制几个模块就可以轻松实现一个爬虫. 1.架构  Scra ...

  6. ocrosoft 1015 习题1.22 求一元二次方程a*x^2 + b*x + c = 0的根

    http://acm.ocrosoft.com/problem.php?id=1015 题目描述 求一元二次方程a*x2 + b*x + c = 0的根.系数a.b.c为浮点数,其值在运行时由键盘输入 ...

  7. ios点击输入框,界面放大解决方案

    当我们编写的input宽度没有占满屏幕宽度,而且又没有申明meta,就会出现点击输入框,界面放大这个问题. 下面我直接给出解决方案: <meta name="viewport" ...

  8. C#设计模式之1:策略模式

    首先需要说明的是该系列的所有内容都是基于headfirst设计模式来描述的.因为我之前也看过不少关于设计模式的书,还是发现这本最好,因为这本书里面给出的例子是最贴切实际的.不说了,开始这个系列吧! 策 ...

  9. java注解和自定义注解的简单使用

    前言 在使用Spring Boot的时候,大量使用注解的语法去替代XML配置文件,十分好用. 然而,在使用注解的时候只知道使用,却不知道原理.直到需要用到自定义注解的时候,才发现对注解原理一无所知,所 ...

  10. w3c JS测试

    到W3c的js测试里面溜达了一圈: 做错了几道题: 外部脚本必须包含<script>标签吗? 否!! 这里的外部脚本是指xx.js这个文件,在文件中写js代码是不需要包含script标签的 ...