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> ...
随机推荐
- <iOS小技巧>UIview指定设置控件圆角
一.用法: 众所周知,设置控件的圆角使用layer.cornerRadius属性即可,但是这样设置成的结果是4个边角都是圆角类型. 利用班赛尔曲线画角: //利用班赛尔曲线画角 UIB ...
- js中prototype与__proto__区别
proto(隐式原型)与prototype(显式原型) 显式原型 explicit prototype property:每一个函数在创建之后都会拥有一个名为prototype的属性,这个属性指向函数 ...
- wed前端html/css简单理解
开发工具: txt文本 / dreamwave:DW(cs6/cc) / Hbuilder / webstorm / sublime / vscode 前端: 知识架构: 3层: 结构 / 表现 / ...
- ES 21 - Elasticsearch的高级检索语法 (包括term、prefix、wildcard、fuzzy、boost等)
目录 1 term query - 索引词检索 1.1 term query - 不分词检索 1.2 terms query - in检索 2 prefix query - 前缀检索 3 wildca ...
- Spring Boot:实现MyBatis动态创建表
综合概述 在有些应用场景中,我们会有需要动态创建和操作表的需求.比如因为单表数据存储量太大而采取分表存储的情况,又或者是按日期生成日志表存储系统日志等等.这个时候就需要我们动态的生成和操作数据库表了. ...
- centos 5.5版本中添加ext4格式
1.我在使用centos 5.5版本做练习的时候发现默认是不支持ext4文件格式. 在添加硬盘后,用fdisk -l 查看到信息如下: 分区完后,使用命令:mkfs -t ext4 /dev/sdb会 ...
- 曹工说Tomcat2:自己撸一个简易Tomcat Digester
一.前言 框架代码其实也没那么难,大家不要看着源码就害怕,现在去看 Tomcat 3.0的代码,保证还是看得懂一半,照着撸一遍基本上很多问题都能搞定了.这次我们就模拟 Tomcat 中的 Digest ...
- 【STL】集合运算
STL中有可以实现交集.并集.差集.对称差集的算法. 使用前需要包含头文件: #include <algorithm> 注:使用计算交集和并集的算法必须保证参与运算的两个集合有序!!! 交 ...
- zabbix报警信息设置
报警信息 默认标题: 服务器监控报警 告警主机:{HOST.NAME} 主机IP: {HOST.IP} 告警级别:{TRIGGER.SEVERITY} 告警信息:{TRIGGER.NAME} 问题详情 ...
- 【HDU - 3085】Nightmare Ⅱ(bfs)
-->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...