本人的代码可以说洛谷最简单的了

我的存图方式有些与众不同

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 【旅行】的更多相关文章

  1. 【题解】 P5022旅行

    [题解]P5022 旅行 当给定你一颗树的时候,这题就是一道送分题,凉心啊! 但是给定你一颗基环树呢? 暴力断环直接跑. 但是数据范围\(n\le 1000\) 乱做就完事了. 考场上这样想的,对于\ ...

  2. luogu P2134 百日旅行

    题目链接 luogu P2134 百日旅行 题解 dp方程好想吧 优化有些玄学惹 不会证.... 不过我会三分和贪心 \滑稽 但还是写dp吧 代码 #include<cstdio> #in ...

  3. [luogu P3313] [SDOI2014]旅行

    [luogu P3313] [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神 ...

  4. luogu题解P2312解方程--暴力模+秦九韶

    题目链接 https://www.luogu.org/problemnew/show/P2312 分析 这道题很毒啊,这么大的数. 但是如果多项式\(\sum_{i=0}^N a[i]*X^i=0\) ...

  5. 【luogu P5022 旅行】 题解

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

  6. 洛谷 P5022 旅行——题解

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

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

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

  8. luogu题解P2502[HAOI2006]旅行--最小生成树变式

    题目链接 https://www.luogu.org/problemnew/show/P2502 分析 一个很\(naive\)的做法是从\(s\)到\(t\)双向BFS这当然会TLE 这时我就有个想 ...

  9. Luogu P5022 旅行

    开始写复赛题了 先放张图纪念我惨烈的卡常之路 不说了,简直悲伤 题目链接 思路么..不想写了 Code //不要在意四十行超级加速,卡常用的 #include<bits/stdc++.h> ...

随机推荐

  1. lodop+art-template实现web端漂亮的小票样式打印

    一. 现状 由于之前采用Lodop打印控件(商业版付费,可以使用免费版 但是会有水印)去打印小票,是一行一行的打印,但是不满足UI给到复杂布局的小票样式,所以得重新考虑如何来实现. 二. 介绍 art ...

  2. Java中到底是值传递还是引用传递?

    Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...

  3. TCP/IP 第三章

    1,ip协议不可靠.无连接特性介绍 不可靠:计算机A往计算机B发送数据报1,若途径的路由器缓存已满,或者ttl(time to live 生存周期)到了,则路由器直接丢弃数据包1,并产生icmp数据包 ...

  4. visudo 与 /etc/sudoers

    增加多个用户免密码登录 User_Alias USER_OPS = zouyi,hanerhui,shibeibei,gaoxudong,xiaoyuelin,wangsongfeng,sunjian ...

  5. python 查询 elasticsearch 常用方法(Query DSL)

    1. 建立连接 from elasticsearch import Elasticsearch es = Elasticsearch(["localhost:9200"]) 2. ...

  6. Codeforces 776D:The Door Problem(DFS染色)

    http://codeforces.com/problemset/problem/776/D 题意:有n个门,m个开关,每个门有一个当前的状态(0表示关闭,1表示打开),每个开关控制k个门,但是每个门 ...

  7. 配置Windows server 用户和组权限实验详解

    目录 操作步骤如下: 在Windows Server开始菜单下点击管理工具下的计算机管理 新建用户 用户创建完毕 新建文件夹 配置技术部读取"技术资料"和"常用软件&qu ...

  8. c++二分查找

    c++二分查找 题目是在一些数字里找出一个数字,并输出他在第几行 代码 + 注释 #include <stdio.h> #include<iostream> using nam ...

  9. Java学习笔记之---构造方法

    Java学习笔记之---构造方法 (一)构造方法的特性 构造方法不能被对象单独调用 构造方法与类同名且没有返回值 构造方法只能在对象实例化的时候被调用 当没有指定构造方法时,系统会自动添加无参的构造方 ...

  10. 从无到有构建vue实战项目(五)

    八.错误总结(一) webpack打包项目识别子组件路径问题 之所以出现了这样的问题是因为在webpack打包项目时,未将此处的子组件路径正确识别: 将此处的carousel改为carousel.vu ...