图论算法与模型(训练指南题库)

Posted fzl194

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图论算法与模型(训练指南题库)相关的知识,希望对你有一定的参考价值。

一、基础题目

1、UVA 11624 Fire!迷宫问题 多源BFS

题意:

帮助joe走出一个大火蔓延的迷宫,其中joe每分钟可往上下左右四个方向之一走,所有着火的格子都会蔓延(空格与着火格有公共边,下一分钟这个空格也会着火)。迷宫中有一些障碍格,joe和火都无法进入,当joe走到一个边界的格子我们认为他走出了迷宫

输出R行C列的迷宫,#表示墙,.表示空地,J表示joe,F是着火格

如果能走出,输出最少时间否则,impossible

思路:

先预处理出每个点的起火时间,可以用多源点BFS直接处理出来

再用BFS求从出发点到边界的最短路,每次扩展点的时候保证走到该点的时间严格小于该点起火时间

代码:

https://paste.ubuntu.com/p/R4bpSJDGvP/

 

 

2、UVA 10047 The Monocycle 迷宫问题 复合状态

 题意:

从起点到终点,每秒可以选择前进、向左、向右转, 每前进一格轮子转到下一个颜色, 一共5种颜色, 开始的时候绿色接触地面,朝北, 要求最后也绿色接触地面,求能否到达目标点以及最短时间。

思路:

BFS 多了两维状态 直接模拟即可

代码:

https://paste.ubuntu.com/p/QRDxqFxN6F/

 

3、UVA 10054 The Necklace 欧拉回路

题意:

n个珠子,每个珠子的两半由不同的颜色组成。 只有相同的颜色才能接在一起, 问能否组成一个一个项链。

思路:

判断每个点的度数均为偶数个,判断图联通,注意有重边。然后用刘汝佳的欧拉回路模板即可。

代码:

https://paste.ubuntu.com/p/9VPsbRh53M/

 

4、UVALive 4255 Guess 拓扑排序

题意:

对于一个序列a1,a2,a3,….an,我们可以计算出一个符号矩阵S,就是上面右图矩阵,其中S(i,j)表示 ai+…+aj的正负号,给出序列不难求出矩阵,我们的任务是求出“逆问题”,即给出矩阵,求出序列,序列每个值大于-10小于10;

思路:

拓扑排序即可,主意需要用Kahn算法进行拓扑排序,因为有多个入度为0的点的话,必须设置成权值一样的点。

 代码:

https://paste.ubuntu.com/p/VwF7NcWZnx/

 

5、UVAlive 3523 Knights of the Round Table 二分图+双连通分量

题意:

n(n1000)个骑士,m(m1000000)对骑士互相憎恨,要3个以上的骑士且保证互相憎恨的骑士不会坐在相邻位置才能开会议,求多少骑士一定不能参加任何一次会议。

思路:

首先建图,两个骑士可以相邻,那么就连边。那么题目转化成求不在任何一个简单奇圈上的节点的个数。如果图G不连通,那么分成几个连通分量来求解。

假设图G连通,那么简单圈上的点必然属于一个双连通分量,所以先找出所有双连通分量。

二分图的充要条件是没有奇圈,可以很明显的得到:如果一个双连通分量是二分图,那么里面的点一定不在奇圈上。

如果一个双连通分量不是二分图,那么里面的点会在奇圈上吗?

答案是一定在奇圈上,首先双连通分量不是二分图,那么里面一定存在一个奇圈C。对于这个连通分量里面的点,有两种状态,在C上和不在C上。

在C上的话,本身C就是一个奇圈

不在C上的话,可以构造出一个奇圈出来。在C上取两点u1和u2,u1到u2有两条不相交路径,并且长度为一奇一偶,对于C外的任意一点v,由于是在双连通分量内,v到u1,v到u2有不相交的两条路径,这样的话,由于u1到u2之间既有偶数长度的路径,也有奇数长度的路径,所以v一定可以和u1 u2构造出奇圈出来。

 

整理一下思路就是首先求出所有的双连通分量,再判断这个双连通分量是不是二分图,如果不是二分图,那么该连通分量里面的点都为可以在奇圈的点,处理出所有可以在奇圈上的点之后,再算出不可以在奇圈上的点的数目即可。

代码:

https://paste.ubuntu.com/p/KjYRQ2rDwR/



以上是关于图论算法与模型(训练指南题库)的主要内容,如果未能解决你的问题,请参考以下文章

《算法竞赛进阶指南》图论习题

Matlab:数模04-图论模型(dijstra算法)

图论算法的数学模型

训练指南 UVALive - 4043(二分图匹配 + KM算法)

图论模型--dijstra算法和floyd算法

训练指南 UVA- 11865(有向最小生成树 + 朱刘算法 + 二分)