【题解】P5022 旅行

当给定你一颗树的时候,这题就是一道送分题,凉心啊!

但是给定你一颗基环树呢?

暴力断环直接跑。

但是数据范围\(n\le 1000\)

乱做就完事了。

考场上这样想的,对于\(m=n​\)的情况,得出来的最佳方案一定没有经过一条树边。那么我们直接枚举那条边不能走,直接\(O(n^2)​\)过就好了。

不过这样的算法有一个\(bug\),是因为\(dfs\)在节点上需要枚举哪个点最小,很可能被卡到\(O(n^3)\),但是\(ccf\)今年换配置了,而且不可能每个点都要枚举\(O(n)\),因为是一棵树,只有一种到达方式。那么就取得了\(96\)分的好成绩。

要是\(D1T2\)没有挂题我就1=了!!

悲伤QAQ

当然,针对上述那种被卡,有很简单的办法解决,我们用的是链式前向星,直接加边的时候把小的后面加进去就好了。

考场代码(\(96\))

#include<bits/stdc++.h>
using namespace std;
inline int qr(){
char c=getchar();
int x=0,q=1;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=x*10+c-48,c=getchar();
return q==-1?-x:x;
}
#define RP(t,a,b) for(int t=(a),edd=(b);t<=edd;t++)
#define DRP(t,a,b) for(int t=(a),edd=(b);t>=edd;t--)
#define ERP(t,a) for(int t=head[a];t;t=e[t].nx)
#define more(a,b) (a)=(a)>(b)?(a):(b)
#define few(a,b) (a)=(a)<(b)?(a):(b)
typedef long long ll;
const int maxn=5005;
struct E{
int to,num,nx;
}e[maxn<<1];
int head[maxn];
bool can[maxn];
int cnt;
inline void add(int fr,int to,int num,bool f){
e[++cnt]=(E){to,num,head[fr]};
head[fr]=cnt;
if(f)
add(to,fr,num,0);
}
int n,m;
int ans[maxn];
int dfn[maxn];
bool usd[maxn];
int top;
bool better;
const int inf=0x3f3f3f3f;
void dfs(int now,int last,int pos){
//cout<<now<<' '<<last<<' '<<pos<<endl;
dfn[++top]=now;
int sav=inf,pin=0;
bool flg=1;
while(flg){
flg=0;
sav=inf;
pin=0;
ERP(t,now)
if((e[t].to!=last)&&(!usd[e[t].to])&&(e[t].to<sav)&&(!can[e[t].num]))
sav=e[t].to,pin=t,flg=1;
//cout<<"now="<<now<<" sav="<<sav<<" flg="<<flg<<endl;
if(flg)
usd[e[pin].to]=1,dfs(e[pin].to,now,pos+1);
}
} int t1,t2,t3;
inline void init(){
n=qr();
m=qr();
memset(ans,0x3f,sizeof ans);
RP(t,1,m){
t1=qr();
t2=qr();
add(t1,t2,t,1);
}
if(m==n-1){
dfs(1,0,1);
RP(t,1,n)
cout<<dfn[t]<<' ';
cout<<endl;
return;
}
else{
RP(t,1,m){
top=0;
better=0;
memset(usd,0,sizeof usd);
can[t]=1;
dfs(1,0,1);
can[t]=0;
if(top==n){
RP(t,1,n){
if(dfn[t]!=ans[t]){
if(dfn[t]<ans[t])
better=1;
break;
}
}
}
if(better&&top==n)
RP(t,1,n)
ans[t]=dfn[t];
}
}
RP(t,1,n)
cout<<ans[t]<<' ';
cout<<endl;
return; } int main(){
// freopen("travel.in","r",stdin);
// freopen("travel.out","w",stdout);
init();
return 0;
}

\(AC\)代码

#include<bits/stdc++.h>
using namespace std;
inline int qr() {
char c=getchar();
int x=0,q=1;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=x*10+c-48,c=getchar();
return q==-1?-x:x;
}
#define RP(t,a,b) for(int t=(a),edd=(b);t<=edd;t++)
#define DRP(t,a,b) for(int t=(a),edd=(b);t>=edd;t--)
#define ERP(t,a) for(int t=head[a];t;t=e[t].nx)
#define more(a,b) (a)=(a)>(b)?(a):(b)
#define few(a,b) (a)=(a)<(b)?(a):(b)
typedef long long ll;
const int maxn=5005;
struct E {
int to,num,nx;
} e[maxn<<1];
struct sav {
int fr,to,num;
} data[maxn<<1];
int head[maxn];
bool can[maxn];
int cnt;
inline bool cmp(sav a,sav b) {
return a.to>b.to;
}
inline void add(int fr,int to,int num) {
e[++cnt]=(E) {
to,num,head[fr]
};
head[fr]=cnt;
}
int n,m;
int ans[maxn];
int dfn[maxn];
bool usd[maxn];
int top;
bool better;
const int inf=0x3f3f3f3f;
void dfs(int now,int last,int pos) {
dfn[++top]=now;
ERP(t,now) {
if((e[t].to!=last)&&(!usd[e[t].to])&&(!can[e[t].num]))
usd[e[t].to]=1,dfs(e[t].to,now,pos+1);
} }
int t1,t2,t3;
inline void init() {
n=qr();
m=qr();
memset(ans,0x3f,sizeof ans);
RP(t,1,m) {
t1=qr();
t2=qr();
data[t].to=t1;
data[t].fr=t2;
data[t+m].fr=t1;
data[t+m].to=t2;
data[t].num=t;
data[t+m].num=t;
}
sort(data+1,data+m+m+1,cmp);
RP(t,1,m+m)
add(data[t].fr,data[t].to,data[t].num);
if(m==n-1) {
dfs(1,0,1);
RP(t,1,n)
cout<<dfn[t]<<' ';
cout<<endl;
return;
} else {
RP(t,1,m) {
top=0;
better=0;
memset(usd,0,sizeof usd);
can[t]=1;
dfs(1,0,1);
can[t]=0;
if(top==n) {
RP(t,1,n) {
if(dfn[t]!=ans[t]) {
if(dfn[t]<ans[t])
better=1;
break;
}
}
}
if(better&&top==n)
RP(t,1,n)
ans[t]=dfn[t];
}
}
RP(t,1,n)
cout<<ans[t]<<' ';
cout<<endl;
return;
} int main() {
// freopen("travel.in","r",stdin);
// freopen("travel.out","w",stdout);
init();
return 0;
}

【题解】 P5022旅行的更多相关文章

  1. 【luogu P5022 旅行】 题解

    题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的 ...

  2. 洛谷 P5022 旅行——题解

    发现大部分题解都是O(n^2)的复杂度,这里分享一个O(n)复杂度的方法. 题目传送 首先前60%的情况,图是一棵无根树,只要从1开始DFS,每次贪心走点的编号最小的点就行了.(为什么?因为当走到一个 ...

  3. 洛谷P5022 旅行 题解 去环/搜索

    题目链接:https://www.luogu.org/problem/P5022 这道题目一开始看的时候没有思路,但是看到数据范围里面有一个: \(m = n-1\) 或 \(m = n\) ,一下子 ...

  4. luogu题解 P5022 【旅行】

    本人的代码可以说洛谷最简单的了 我的存图方式有些与众不同 a[5000][5000]中第一个下标表示第几个点,第二个表示与点相连的点 虽然比前向星废内存但时间极快,大概是O(n)的. 现在步入正题 6 ...

  5. 洛谷P5022 旅行 题解

    前面几个代码都是部分分代码,最后一个才是AC了的,所以最后一个有详细注释 安利一发自己的Blog 这是提高组真题,233有点欧拉回路的感觉. 题目大意: 一个 连通 图,双向边 ,无重边 , 访问图中 ...

  6. 竞赛题解 - NOIP2018 旅行

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

  7. P5022 旅行

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

  8. P5022 旅行 (NOIP2018)

    传送门 先考虑是一颗树的情况 求最小的 dfs 序 显然按儿子编号从小到大dfs 如果有多一条边怎么办 显然会有一条边不用走 直接枚举删那条边然后每次都暴力 dfs 复杂度 $O(n^2)$ 注意每个 ...

  9. 【题解】旅行-C++

    Description 某趟列车的最大载客容量为V人,沿途共有n个停靠站,其中始发站为第1站,终点站为第n站.在第1站至第n-1站之 间,共有m个团队申请购票搭乘,若规定:(1)对于某个团队的购票申请 ...

随机推荐

  1. cocos2dx 2.x新建项目

    举例: cocos2d-x-2.2.6/tools/project-creator 进入 这个文件夹 chmod 777 project-cereator.py ./create_project.py ...

  2. 使用Eclipse Memory Analyzer进行内存泄漏分析三部曲

    源地址:http://seanhe.iteye.com/blog/898277 一.准备工作  分析较大的dump文件(根据我自己的经验2G以上的dump文件就需要使用以下介绍的方法,不然mat会出现 ...

  3. 鼠标悬浮弹出标题制作JQuery

    今天给客户制作的网站里面加个效果,当鼠标在列表图片之外时,标题不显示,当鼠标悬浮在图片之上时,标题从底部弹出. 效果图如下: 鼠标悬浮前: 鼠标悬浮后: html代码如下: <ul class= ...

  4. 关于异步请求AJAX的具体解释

    1,异步请求的方法步骤: 1,推断当前用户支持的浏览器类型 XMLHttpRequest:推断是否支持非IE浏览器,相应的创建方法:xmlhttp = new XMLHttpRequest(); wi ...

  5. /etc/shadow 密码加密方法

    [root@mysql-master ~]# cat /etc/shadowroot:$6$spzQDWctb8Lmju0o$KoUz5Qwv1tWyVYfd5cuBw.TQVIaCvCX8ixGG9 ...

  6. 谈论程序中的token

    -> //指针,一旦符号分开就会成以下两个意思,我们一定要注意符号 - //减号 > //大与 int a,big; if(x>big) big = x; C语言以及一些其它语言会自 ...

  7. qs库使用

    1.npm地址 https://www.npmjs.com/package/qs 2.概述 将url中的参数转为对象: 将对象转为url参数形式 3.示例 import qs from 'qs'; c ...

  8. LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(*)

    翻译 反转一个单链表. 原文 Reverse a singly linked list. 分析 我在草纸上以1,2,3,4为例.将这个链表的转换过程先用描绘了出来(当然了,自己画的肯定不如博客上面精致 ...

  9. 命令行编译sass

    一.安装ruby1.需要的软件设备: 2.安装过程:点击上图“应用程序”安装即可,注意安装过程中其中三项都需要打上勾.如若没有三项都打上勾则需要修改环境变量中的path路径后添加一个分号. 3.打开c ...

  10. VueJS样式绑定之内联样式v-bind:style

    我们可以在 v-bind:style 直接设置样式: 直接添加样式属性 HTML <!DOCTYPE html> <html> <head> <meta ch ...