【图论】BFS+欧拉回路

标题有点大,但是事实上我也确实是想弄一个比较大整理性文章。这些文章的绝大多数我不准备写代码了,但强迫自己不看题解自己去想那些题目怎么写,然后把相类似的题目放在一起用来帮助我分析,并且将知识点串起来复习。题目大多数来自于算法入门经典系列,CODEVS,BZOJ,XJOI,HUSTOJ,等。
Vjudge
- 大火蔓延的迷宫(Fire!,UVa 11624) 算法入门经典训练指南P307.

Fire!
Description:
一个平面迷宫中有一个人,迷宫中有些点起火了,火和人每个单位时间只能向相邻的格子移动,其中有一些空间被墙壁占据,问这个人在不背或烧到的情况下,离开迷宫的最快时间。

题解:
这个题目因为这个火可以动,这样的话我们所能够走的地方就受到了限制,我们每次走到一个点,不但要考虑到那个点最短时间而且同时还要考虑那个点之前是否被火烧过。

这样似乎是比较麻烦,那么我们考虑首先预处理出从每个点到最近的火的位置,恩,这样的话我们最后找走出迷宫的最短路就除了考虑是否有更短的点以外还要考虑是否有火在我到之前到。

Hint:我们在初始的时候将所有的点一次性加入队列

  • escape(这是NOIP十连测的题目没有连接)

Description
给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上矩形的
行号从0到X-1,列号从0到Y-1再给出四个数字x1,y1,x2,y2,代表你要从点(x1,y1)移到(x2,y2)。在移动的过程中你
当然希望离敌人的距离的最小值最大化,现在请求出这个值最大可以为多少,以及在这个前提下你最少要走多少步
才可以回到目标点。注意这里距离的定义为两点的曼哈顿距离,即某两个点的坐标分为(a,b),(c,d)那么它们的距
离为|a-c|+|b-d|
Input
第一行给出数字N,X,Y
第二行给出x1,y1,x2,y2
下面将有N行,给出N个敌人所在的坐标
Output
在一行内输出你离敌人的距离及在这个距离的限制下,你回到目标点最少要移动多少步。
Sample Input
2 5 6
0 0 4 0
2 1
2 3
Sample Output
2 14

这个题目算作是上面那个题目的升级版本了。现在我们要求我们到敌人的距离的最小值最大,这种题目一般就是二分啦,仍然预处理出每个点到最近的敌人的距离,然后我们二分我们到敌人的距离,并验证是否能行,借此不断调整左右直到算出答案。

Hint:这种二分的问题,我们要考虑我们的初始点就不符合要求的情况

  • 独轮车 (The Monocycle,Uva 10047)

Description:
给你一个独轮车,轮子上有五个扇形,每过一个格子就转过一个扇形,刚开始的时候方向是向北的,绿色上行向下,每一次可以有三种操作,到下一个格子,左转90度,右转90度,每一次操作都花费时间1,问从起点到终点的最小步数,要求到终点的时候必须还是绿色扇形向下,方向无所谓。

题解:
这题目首先我们到每个点之后轮子的颜色会变化,并且我方向不同的话时间也不同。那我们暴力一点把这多出来的状态加进数组里面。
定义:dis[x][y][c][d] 为到(x,y)颜色为c的轮子在下面朝向方向 d的最短距离是多少。

Hint:图论有时候和DP一样如果状态搞不定了尝试一下能不能通过加维来解决?

  • 项链(The Necklace,UVa 10054)
    Description:
    有一串珠子,每个珠子的前半部分和后半部分都有一种颜色。两个珠子颜色相同的部分,可以连到一起。给定一些珠子看是否能用所有这些珠子串成一个项链。
    题解:
    画个图模拟一下,似乎就是讲这个项链串成一个项链(这不是废话吗?还要你说?)额,就是这样在每一个珠子的左边到右边连接一条无向边,然后求欧拉回路。
    因为这个题目比较坑爹,而且这是一个专题,我就单独的写个文章作为题解,这边就作为一个引子
    欧拉路径

你可能感兴趣的:(图论,欧拉回路)