zoukankan      html  css  js  c++  java
  • jzoj6094

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

    多组数据,其中$Tleq127749$,$2leq nleq50$,$a,bleq50$.

    比赛记录

    比赛的时候一直在想这道题,想到了一个结论,就是一个这样的合法的流一定是由若干个简单环拼在一起,于是就写了一个暴力,但是由于对题目理解的不够深,导致我判断一个$(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 eq n$或$j eq n$时,构成的环不合法.

    4.若$i+j>k$,且$i eq1$,那么一定合法

    考虑证明第四条结论

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

    对于$ngeq 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)$这两条边,显然这样依然满足条件,所以结论成立

  • 相关阅读:
    链队列的初始化,建立,插入,查找,删除。
    顺序队列的初始化,建立,插入,查找,删除。
    顺序栈的初始化,建立,插入,查找,删除。
    双链表的初始化,建立,插入,查找,删除。
    MT6737 Android N 平台 Audio系统学习----录音到播放录音流程分析
    内核Alsa之pcm
    platform_set_drvdata 和 platform_get_drvdata
    linux 中mmap的用法
    src源dst目标
    复旦软件工程专业课
  • 原文地址:https://www.cnblogs.com/withoutpower/p/10622107.html
Copyright © 2011-2022 走看看