luogu题解 P5022 【旅行】
本人的代码可以说洛谷最简单的了
我的存图方式有些与众不同
a[5000][5000]中第一个下标表示第几个点,第二个表示与点相连的点
虽然比前向星废内存但时间极快,大概是O(n)的。
现在步入正题
60分代码思路
用深搜查找最小路径很简单
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[5005][5005],lj[5005]={0},c[5005]={0},s=0,fs=1,h[5005]={0},huan=0,dd=0,b[5009][5009];
int cmp(int aa,int bb)
{
return a[aa]<a[bb];
}
void dfs(int x)
{
c[x]++;
if(s==1)return ;
if(fs==n)
{
printf("\n");
s=1;
return ;
}
for(int i=1;i<=lj[x];i++)
{
if(c[a[x][i]]==0)
{
printf("%d ",a[x][i]);
fs++;
dfs(a[x][i]);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int aa,bb;
scanf("%d%d",&aa,&bb);
lj[aa]++;
lj[bb]++;
a[aa][lj[aa]]=bb;
a[bb][lj[bb]]=aa;
b[aa][bb]=1;
}
for(int i=1;i<=n;i++)
sort(a[i]+1,a[i]+lj[i]+1,cmp);
printf("1 ");
if(m==n-1)
dfs(1);
return 0;
}
至于满分还需要n==m的情况
100分思路
先判断环
将环找出
做好标记
再深搜在环上判断
情况有很多详见代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[5005][5005],lj[5005]={0},c[5005]={0},s=0,fs=1,h[5005]={0},huan=0,dd=0,b[5009][5009];
int cmp(int aa,int bb)
{
return a[aa]<a[bb];
}
void dfs(int x)
{
c[x]++;
if(s==1)return ;
if(fs==n)
{
printf("\n");
s=1;
return ;
}
for(int i=1;i<=lj[x];i++)
{
if(c[a[x][i]]==0)
{
printf("%d ",a[x][i]);
fs++;
dfs(a[x][i]);
}
}
}
void dfs1(int x)
{
c[x]++;
if(s==1)return ;
if(c[x]==2)
{
h[x]=1;
huan=x;
return ;
}
for(int i=1;i<=n;i++)
{
if((b[x][a[x][i]]==1||b[a[x][i]][x]==1)&&huan==0)
{
b[x][a[x][i]]=b[a[x][i]][x]=0;
dfs1(a[x][i]);
if(huan!=0&&huan!=x&&s!=1)h[x]=1;
if(huan==x)s=1;
}
}
}
int dyc=0,huandedazhi=1000000,ag=0,hhl=0,bxyjz=0;
int zb=100000;
void ac(int x)
{
c[x]++;
if(s==1)return ;
if(fs==n)
{
printf("\n");
s=1;
return ;
}
if(x==huan&&dyc==0)
{
dyc=1;
int h1=0,h2;
for(int i=1;i<=lj[x];i++)
{
if(h[a[x][i]]==1)
{
if(h1==0)h1=a[x][i];
else h2=a[x][i];
}
}
huandedazhi=max(h1,h2);
zb=huandedazhi;
}
if(x==huandedazhi)ag=11;
for(int i=1;i<=lj[x];i++)
{
if(c[a[x][i]]==0)
{
if(h[a[x][i]]==0)
{
printf("%d ",a[x][i]);
fs++;
ac(a[x][i]);
}
if(h[a[x][i]]==1)
{
if(a[x][i+1]!=0&&(a[x][i]<huandedazhi||ag==0)&&h[a[x][i+1]]==0&&h[x]==1)
zb=a[x][i+1];
if(a[x][i]>zb&&ag==0)
{
ag=1;
}
else
{
printf("%d ",a[x][i]);
fs++;
ac(a[x][i]);
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int aa,bb;
scanf("%d%d",&aa,&bb);
lj[aa]++;
lj[bb]++;
a[aa][lj[aa]]=bb;
a[bb][lj[bb]]=aa;
b[aa][bb]=1;
}
for(int i=1;i<=n;i++)
sort(a[i]+1,a[i]+lj[i]+1,cmp);
printf("1 ");
if(m==n-1)
dfs(1);
if(m==n)
{
dfs1(1);
for(int i=1;i<=n;i++)c[i]=0;s=0;
ac(1);
}
}
luogu题解 P5022 【旅行】的更多相关文章
- 【题解】 P5022旅行
[题解]P5022 旅行 当给定你一颗树的时候,这题就是一道送分题,凉心啊! 但是给定你一颗基环树呢? 暴力断环直接跑. 但是数据范围\(n\le 1000\) 乱做就完事了. 考场上这样想的,对于\ ...
- luogu P2134 百日旅行
题目链接 luogu P2134 百日旅行 题解 dp方程好想吧 优化有些玄学惹 不会证.... 不过我会三分和贪心 \滑稽 但还是写dp吧 代码 #include<cstdio> #in ...
- [luogu P3313] [SDOI2014]旅行
[luogu P3313] [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神 ...
- luogu题解P2312解方程--暴力模+秦九韶
题目链接 https://www.luogu.org/problemnew/show/P2312 分析 这道题很毒啊,这么大的数. 但是如果多项式\(\sum_{i=0}^N a[i]*X^i=0\) ...
- 【luogu P5022 旅行】 题解
题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的 ...
- 洛谷 P5022 旅行——题解
发现大部分题解都是O(n^2)的复杂度,这里分享一个O(n)复杂度的方法. 题目传送 首先前60%的情况,图是一棵无根树,只要从1开始DFS,每次贪心走点的编号最小的点就行了.(为什么?因为当走到一个 ...
- 洛谷P5022 旅行 题解 去环/搜索
题目链接:https://www.luogu.org/problem/P5022 这道题目一开始看的时候没有思路,但是看到数据范围里面有一个: \(m = n-1\) 或 \(m = n\) ,一下子 ...
- luogu题解P2502[HAOI2006]旅行--最小生成树变式
题目链接 https://www.luogu.org/problemnew/show/P2502 分析 一个很\(naive\)的做法是从\(s\)到\(t\)双向BFS这当然会TLE 这时我就有个想 ...
- Luogu P5022 旅行
开始写复赛题了 先放张图纪念我惨烈的卡常之路 不说了,简直悲伤 题目链接 思路么..不想写了 Code //不要在意四十行超级加速,卡常用的 #include<bits/stdc++.h> ...
随机推荐
- Wp8 Popup不随输入法偏移问题解决方案
在wp中我们经常要实现,浮窗的效果这时我们就会考虑到Popup,但是在用Popup开发我们会遇到一个非常尴尬的问题,由于Popup不在主界面的可视化树内,在Popup显示的位置在输入法面板出现的范围时 ...
- 使用C++还是QML(QML容易使用和维护,效果好)
本质上,Qt 是一个C++类库.在引入 QML 以前,所有的开发都是基于 C++ 的,但到了 Qt 5,QML 和 Qt Quick 成为了 Qt 的核心之一,导致很多初学者在犹豫是否还需要学习 C+ ...
- Qt设置窗体的透明度: setWindowOpacity
在Qt中,设置窗体透明度的函数有:void setWindowOpacity(qreal level) 特性: 透明度的有效范围从1.0(完全不透明)到0.0(完全透明的). 默认情况下,此属 ...
- Java对象结构及HotSpot对象模型
一.对象结构 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding).下图是普通对象实例与数组对象 ...
- 敏捷开发中如何做好Sprint规划?
什么是Sprint规划? Sprint规划是scrum中用来启动Sprint的事件.迭代规划的目标是定义Sprint可以交付的内容,以及如何完成各项工作.迭代规划需要整个scrum团队合作完成. 与体 ...
- Kafka笔记3
向Kafka写入消息从创建一个ProducerRecord对象开始,ProducerRecord需要包含目标主题和要发送的内容,我们还可以指定键或分区,在发送ProducerRecord对象时,生产者 ...
- hgoi#20190519
更好的阅读体验 来我的博客观看 T1-求余问题 Abu Tahun很喜欢回文. 一个数组若是回文的,那么它从前往后读和从后往前读都是一样的,比如数组{1},{1,1,1},{1,2,1},{1,3,2 ...
- DHCP命令执行CVE-2018-1111漏洞复现
DHCP命令执行_CVE-2018-1111漏洞复现 一.漏洞描述 在Red Hat Enterprise Linux多个版本的DHCP客户端软件包所包含的NetworkManager集成脚本中发现了 ...
- URL收集
window下 php5.5 安装pthread扩展:http://blog.csdn.net/aoyoo111/article/details/19020161
- iOS开发(4):录音AVAudioRecorder
录音,声音的采集,一般有两种实现办法,一是使用AVAudioRecorder,一是使用AudioUnit.如果只是简单的录音,使用AVAudioRecorder就可以了,如果想更灵活地处理刚录到的声音 ...