BZOJ

洛谷

这种题大多是多源多汇跑网络流。往返\(a_n/b_n\)次可以看做去\(a_n/b_n\)次,直接把危桥能走的次数看做\(1\)。

先不考虑别的,直接按原图建模:危桥建双向边容量为\(1\),普通桥容量为\(INF\);然后源点\(S\)向\(a_1,b_1\)分别连容量\(a_n,b_n\)的边,\(a_2,b_2\)分别向汇点\(T\)连容量\(a_n/b_n\)的边。

这样跑出来的最大流会有两个问题:

一是,\(b_2\to T\)的\(b_n\)的一部分流量可能是来自\(a_1\)的,同理\(a_2\to T\)的一些流量可能来自\(b_1\)。

二是,危桥只能走一次,但这样可能会正反走两次。

也就是不能直接判断是否满流来判断是否可行。办法是,交换\(b_1,b_2\)(\(S\)连\(b_2\),\(b_1\)连\(T\)),重新建图,再跑最大流。只有两次均满流才一定存在可行方案。

交换\(b_1,b_2\)后再判断是否满流,如果你觉得问题一显然已经被解决了可以跳过下面这段。

如果满流且仍然存在问题一那种情况呢?画个图。

假设第一次跑最大流,\(a_1\to b_2\)的流量为\(x\),那么\(b_1\to b_2\)的流量为\(b_n-x\),\(b_1\to a_2\)的流量也是\(x\),\(a_1\to a_2\)的流量是\(a_n-x\)。

而第二次跑最大流,因为是无向图,\(a_1\to a_2\)和\(b_2\to b_1\)的流量可以不变,还是\(a_n-x,b_n-x\)。那么\(a_1\to b_1\)和\(b_2\to a_2\)的流量也都还是\(x\)。

而这两次说明了什么呢,\(a_1\)可以流到\(b_1\) \(x\)流量,还可以流到\(b_2\) \(x\)流量,同时不影响\(a_1\)与\(a_2\),\(b_1\)与\(b_2\)之间的流量。因为是无向图,将\(a_1\to b_1\)的流量反向,就可以得到\(b_1\to b_2\) \(x\)的流量。\(b_1,b_2\)之间的流就合法了。

同理\(a_1,a_2\)之间的流也合法。

所以如果交换\(b_1,b_2\)后仍满流,一定不存在问题一那种情况。

对于问题二,好多题解都没有写也许是太显然了?

假如\(a_1\to a_2\)正向经过了一座危桥,而\(b_1\to b_2\)反向经过了这座桥,那么交换\(b_1,b_2\),以\(b_2\)为起点后,\(a_1\to a_2,b_2\to b_1\)两条路径都是正向通过了这条边,就受到了流量的限制。

所以如果仍满流,不存在问题二。

所以两遍最大流就可以了。

//924kb	32ms
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=55,M=N*N<<1,INF=0x3f3f3f3f; int src,des,Enum,H[N],nxt[M],to[M],fr[M],cap[M],pre[N],lev[N];
char s[N][N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AE(int u,int v,int w)
{
to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w;
to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=w;
}
inline void AE2(int u,int v,int w)
{
to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w;
to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=0;
}
bool BFS()
{
static int q[N];
for(int i=0; i<des; ++i) lev[i]=des+1;
int h=0,t=1; q[0]=des, lev[des]=0;
while(h<t)
{
int x=q[h++];
for(int i=H[x]; i; i=nxt[i])
if(lev[to[i]]==des+1 && cap[i^1]) lev[to[i]]=lev[x]+1, q[t++]=to[i];
}
return lev[0]<=des;
}
inline int Augment()
{
int mn=INF;
for(int i=des; i; i=fr[pre[i]])
mn=std::min(mn,cap[pre[i]]);
for(int i=des; i; i=fr[pre[i]])
cap[pre[i]]-=mn, cap[pre[i]^1]+=mn;
return mn;
}
int ISAP()
{
static int num[N],cur[N];
if(!BFS()) return 0;
memset(num,0,sizeof num);
for(int i=0; i<=des; ++i) ++num[lev[i]],cur[i]=H[i];
int res=0,x=0;
while(lev[0]<=des)
{
if(x==des) x=0, res+=Augment();
bool can=0;
for(int i=cur[x]; i; i=nxt[i])
if(lev[to[i]]==lev[x]-1 && cap[i])
{
can=1, cur[x]=i, pre[x=to[i]]=i;
break;
}
if(!can)
{
int mn=des;
for(int i=H[x]; i; i=nxt[i])
if(cap[i]) mn=std::min(mn,lev[to[i]]);
if(!--num[lev[x]]) break;
++num[lev[x]=mn+1], cur[x]=H[x];
if(x) x=fr[pre[x]];
}
}
return res;
} int main()
{
int n;
while(~scanf("%d",&n))
{
src=0, des=n+1;
int a1=read()+1,a2=read()+1,an=read(),b1=read()+1,b2=read()+1,bn=read();
for(int i=1; i<=n; ++i) scanf("%s",s[i]+1); Enum=1, memset(H,0,n+2<<2);
for(int i=1; i<=n; ++i)
for(int j=i+1; j<=n; ++j)
switch(s[i][j])
{
case 'O': AE(i,j,1); break;
case 'N': AE(i,j,INF); break;
}
AE2(src,a1,an), AE2(src,b1,bn), AE2(a2,des,an), AE2(b2,des,bn);
if(ISAP()!=an+bn) {puts("No"); continue;} Enum=1, memset(H,0,n+2<<2);
for(int i=1; i<=n; ++i)
for(int j=i+1; j<=n; ++j)
switch(s[i][j])
{
case 'O': AE(i,j,1); break;
case 'N': AE(i,j,INF); break;
}
AE2(src,a1,an), AE2(src,b2,bn), AE2(a2,des,an), AE2(b1,des,bn);
if(ISAP()!=an+bn) {puts("No"); continue;}
puts("Yes");
}
return 0;
}

BZOJ.3504.[CQOI2014]危桥(最大流ISAP)的更多相关文章

  1. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...

  2. bzoj 3504: [Cqoi2014]危桥【最大流】

    妙啊,很容易想到连(s,a1,an)(s,b1,bn)(a2,t,an)(b2,t,bn),这样,但是可能会发生a1流到b2或者b1流到a2这种不合法情况 考虑跑两次,第二次交换b1b2,如果两次都合 ...

  3. bzoj 3504: [Cqoi2014]危桥

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

  4. 3504: [Cqoi2014]危桥

    3504: [Cqoi2014]危桥 链接 分析: 首先往返的可以转化为全是“往”,那么只要将容量除以2即可. 然后S向a1连边容量为an(除以2之前为2*an),S向a2连边容量为an,b1,b2向 ...

  5. 3504. [CQOI2014]危桥【最大流】

    Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...

  6. bzoj3504: [Cqoi2014]危桥--最大流

    题目大意:给张无向图,有两个人a,b分别从各自的起点走向各自的终点,走A,B个来回,图里有些边只能走两次,求问是否能满足a,b的需求 按照题目给的表建图 S连a1,b1 a2,b2连T 跑最大流看是否 ...

  7. bzoj千题计划137:bzoj [CQOI2014]危桥

    http://www.lydsy.com/JudgeOnline/problem.php?id=3504 往返n遍,即单向2*n遍 危桥流量为2,普通桥流量为inf 原图跑一遍最大流 交换b1,b2再 ...

  8. Luogu3163 [CQOI2014]危桥 ---- 网络流 及 一个细节的解释

    Luogu3163 [CQOI2014]危桥 题意 有$n$个点和$m$条边,有些边可以无限次数的走,有些边这辈子只能走两次,给定两个起点和终点$a_1 --> a_2$(起点 --> 终 ...

  9. 【BZOJ 3504】[Cqoi2014]危桥

    Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...

随机推荐

  1. java-HTML&javaSkcript&CSS&jQuery&ajax

    CSS  伪装 1.<style>a;link{color:#000000} a:visited{color:#000000; a.:hover{color:#FF00FF} a:acti ...

  2. Vue注意事项及用得较多的属性归纳

    1.prop是一个对象而不是字符串数组时,它包含验证要求.props: { // 基础类型检测 (`null` 意思是任何类型都可以) propA: Number, // 多种类型 propB: [S ...

  3. AI学习吧-公钥私钥、沙箱环境

    公钥私钥 公钥.私钥 可以互相解密 应用:数字签名和加密数据 数字签名:使用私钥加密,公钥解密 加密数据:使用公钥加密,私钥解密泄密时:当有人拿走了你的公钥,你可以到CI证书中心,使用你的私钥和公钥办 ...

  4. AI学习吧-结算中心

    结算中心流程 在结算中心中,主要是对用户添加到购物车商品的结算,由于用户可能添加了多个课程,但是,结算时会选择性的进行支付.在结算时会选中课程id,和对应的价格策略.在后台,首先会对用户进行校验,验证 ...

  5. linux上安装redis并使用

    1.下载:curl -O http://download.redis.io/releases/redis-4.0.6.tar.gz 2.在/usr/local/redis上解压:tar -zxvf r ...

  6. Android 实现连续两次点击或连续多次点击退出应用

    前言:  日常开发过程中,经常会遇到“连续点击两次退出应用”的需求(和“连续点击多次”的需求(如:手机从设置中进入开发者选项). 直接上代码:双击退出: private long exitTime = ...

  7. 选择结构switch

    1.选择结构switch switch 条件语句也是一种很常用的选择语句,它和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码.例如,在程序中使用数字1~7来表示星期一到 ...

  8. mzf的考验

    题解: 比较水吧 显然是平衡树的操作 然后就是写写写 用对拍来查错相比之下直接样例查还是比较容易的 刚开始没有优化常数没开O2就变成暴力分了smg 开了O2就a了 代码: #include <b ...

  9. Dapper Helper

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  10. GB/T19001—2008质量管理体系要求、标准、贯标(贯彻标准)

    应知应会知识 GB/T19001—2008质量管理体系要求.标准.贯标(贯彻标准)   一.质量管理体系的八项管理原则是什么? 1.以顾客为关注焦点 2.领导作用 3.全员参与 4.过程方法 5.管理 ...