jzoj6094

题目描述
给定一个循环流(每个点均满足流量平衡条件),这个循环流有\(n\)个点,且每条边的流量只有\(1\)\(2\),其中\(a\)条边流量为\(1\),\(b\)条边流量为\(2\),判断是否存在一个流满足上述条件.

多组数据,其中\(T\leq127749\),\(2\leq n\leq50\),\(a,b\leq50\).

比赛记录

比赛的时候一直在想这道题,想到了一个结论,就是一个这样的合法的流一定是由若干个简单环拼在一起,于是就写了一个暴力,但是由于对题目理解的不够深,导致我判断一个\((a,b)\)状态是否可以构成一个简单环时出现了问题,于是暴力凉凉

题目解析

因为是循环流,所以显然一个合法的流网络是由若干个简单环拼接成的,这些简单环有点或边相交,我们可以构造一个简单dp,令\(f[i][j][k]\)表示\(i\)条流量为\(1\)的边,\(j\)条流量为\(2\)的边是否可以构成一个有\(k\)个节点的循环流,考虑转移

\[f[i][j][k] = f[a][b][c] \& f[d][e][f] \ 其中a+b=i,b+e=j,c<=k,f<=k,c+f-1>=k \]

这个dp复杂度是\(O(n^7)\)的.

考虑如下优化:

1.若\(i+j <k\),\(f[i][j][k]\)显然不合法.

2.若\(f[i][j][k]\)合法,则\(f[i+2*l][j-l][k]\)也合法.

3.将\(f\)前缀和,可以少枚举一维.

经过如下玄学优化,可以通过本题.

另外讲一下如何判定\(i\)条流量为\(1\),\(j\)条流量为\(2\)的边是否能构成一个长度为\(k\)的环的循环流.

因为我们知道假如我们固定了让每一条边都从\(i\)流向\(i+1\),那么就很好判断这个状态是否合法,但我们其实可以将一条流量流量为\(2\)的边和一条流量为\(1\)的边捆绑变成一条流量为\(1\)的边,于是我们枚举有多少条边捆绑在一起,暴力判断即可.

更加高明的做法

首先\(n=2\)特判,对于\(n \geq 3\)时,我们可以直接判断出解的情况

1.若\(i+j<k\),显然不合法.

2.若\(i=1\),不合法,因为若流出一点的流量是奇数,那么流入这个点的流量也需要是奇数,所以至少需要\(2\)条.

3.若\(i+j=k\),若\(i=n\)\(j=n\),则合法,否则不合法,因为只有\(k\)条边所以只能构成一个简单环,所以当\(i \neq n\)\(j \neq n\)时,构成的环不合法.

4.若\(i+j>k\),且\(i\neq1\),那么一定合法

考虑证明第四条结论

首先,当\(n=3\)时,我们可以简单构造证明该结论成立.

对于\(n\geq 3\),假设第四条结论对\(k=n-1\)成立,当\(k=n\)时,当\(i=0\)\(j=0\)时显然成立,当\(i,j>0\)时,由第二条结论知道\(i>1\),因此\((i-1,j)\)对于\(k=n-1\)成立,因为\(i-1>0\),所以我们有至少一条流量为\(1\)的边,假设这条边由\(x\)指向\(y\),那么我们可以把这条边去掉,加上\((x,k)\),和\((k,y)\)这两条边,显然这样依然满足条件,所以结论成立

posted @ 2019-03-29 16:23  withoutpower  阅读(216)  评论(0编辑  收藏  举报