【CQOI2014】危桥

来源:互联网 发布:sp版羽毛球拍淘宝店 编辑:程序博客网 时间:2024/06/11 21:08

【CQOI2014】危桥

【题目描述】

Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1。某些岛屿之间有桥相连,桥上的道路是双向的,但一次只能供一人通行。其中一些桥由于年久失修成为危桥,最多只能通行两次。
Alice希望在岛屿a1和a2之间往返an次(从a1到a2再从a2到a1算一次往返)。同时,Bob希望在岛屿b1和b2之间往返bn次。这个过程中,所有危桥最多通行两次,其余的桥可以无限次通行。请问Alice和Bob能完成他们的愿望吗?

【输入】

本题有多组测试数据。
每组数据第一行包含7个空格隔开的整数,分别为N、a1、a2、an、b1、b2、bn。
接下来是一个N行N列的对称矩阵,由大写字母组成。矩阵的i行j列描述编号i-1和j-1的岛屿间连接情况,若为“O”则表示有危桥相连;为N表示有普通桥相连;为“X”表示没有桥相连。

【输出】

对于每组测试数据输出一行,如果他们都能完成愿望输出“Yes”,否则输出“No”。

【输入样例】

4 0 1 1 2 3 1
XOXX
OXOX
XOXO
XXOX
4 0 2 1 1 3 2
XNXO
NXOX
XOXO
OXOX

【输出样例】

Yes
No

【数据范围】

4≤N≤50
0≤a1,a2,b1,b2≤N-1
1≤an,bn≤50

【题解】

一遍AC= =听说CQOI现场只有1人AC?

不难想到使用网络流建图,虚拟一个源点与两人起点相连,再虚拟一个汇点与两人终点相连,危桥流量为2,其他桥流量为INF,然后跑一遍最大流,若最大流大于两人往返次数和的两倍,则可以实现。

很遗憾,这样是错的o(>﹏<)o可以自己YY一下,这样的做法能保证Alice跑过的一定是Alice希望的路吗?换句话说,即使最大流跑了出来,也许找到的路径其中一部分两个人换了位,并不符合题意啊。仔细想了想,这个问题可以这样解决:两遍最大流,第一次源点连接Alice的起点和Bob的起点,第二次源点连接Alice的起点和Bob的终点,如果这样两次的最大流都大于两人往返次数和的两倍,就一定可行。

实际上,我们应该有四次最大流才能保证答案的正确,但由于是双向道路,所以只需两次即可。我们跑的这两次最大流可以这么想:第一次从Alice起点放出an个Alice分身,从Bob起点放出bn个Bob分身,第二次从Alice起点放出an个Alice分身,从Bob终点放出bn个Bob分身,如果均能到达相应的起点(终点),才证明这样的方案是可行的。

因为我太弱了,而且这题是这几天才出来的,所以给出严格证明不大可能了QAQ数据出来后翻了一下,找到这样一组:

6 0 5 3 1 4 2

XXOOXO

XXXNOO

OXXXOX

ONXXXO

XOOXXO

OOXOOX

这组数据两次最大流结果不一样,我手工模拟了一下,如果源点都连起点,那么Alice有一条路从Bob终点出去,Bob有一条路从Alice终点出去。我又试了试只跑第二次最大流,结果WA,证明我YY的思路应该是没错的~

【代码】

Dinic+当前弧优化,还有一个优化不知是不是传说中的弹栈= =

【CQOI2014】危桥#代码
0 0
原创粉丝点击