题目描述

Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1。某些岛屿之间有桥相连,桥上的道路是双

向的,但一次只能供一人通行。其中一些桥由于年久失修成为危桥,最多只能通行两次。Alice希望在岛屿al和a2之间往返an次(从al到a2再从a2到al算一次往返)。同时,Bob希望在岛屿bl和b2之间往返bn次。这个过程中,所有危桥最多通行两次,其余的桥可以无限次通行。请问Alice和Bob能完成他们的愿望吗?

题解

有一个初步的想法,因为图是无向的,所以我们的往返可以看做走两遍。

所以我们就把无向图连出来,然后连上源和汇跑一遍最大流,然后检查是否漫流。

但这样会有一个问题,两股流有可能会有交叉的地方,这样我们有可能会把无解判断成有解。

也就是\(s1->t2\ s2->t1\)。

正解非常巧妙,就是把一条路径反过来再跑一遍,如果还漫流,则说明有解。

为什么,这时如果还满流,那么会有\(s1->s2\ t2->t1\)那么这说明\(s1\)是这股流是可以到\(t1\)的,\(s2\)也是可以到\(t2\)的,则它是有解的。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define N 60
#define inf 1e9
using namespace std;
queue<int>q;
int head[N],tot=1,cur[N],deep[N],n,ans;
char s[N][N];
inline int rd(){
int x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
struct edge{
int n,to,l;
}e[N*N*10];
inline void add(int u,int v,int l){
e[++tot].n=head[u];e[tot].to=v;head[u]=tot;e[tot].l=l;
e[++tot].n=head[v];e[tot].to=u;head[v]=tot;e[tot].l=l;
}
bool bfs(int s,int t){
memcpy(cur,head,sizeof(head));
memset(deep,0,sizeof(deep));
q.push(s);deep[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].n){
int v=e[i].to;
if(!deep[v]&&e[i].l){
deep[v]=deep[u]+1;
q.push(v);
}
}
}
return deep[t];
}
int dfs(int u,int t,int l){
if(u==t||!l)return l;
int flow=0,f;
for(int &i=cur[u];i;i=e[i].n){
int v=e[i].to;
if(deep[v]==deep[u]+1&&(f=dfs(v,t,min(l,e[i].l)))){
e[i].l-=f;e[i^1].l+=f;flow+=f;l-=f;
if(!l)break;
}
}
return flow;
}
int main(){
int a1,a2,an,b1,b2,bn;
while(scanf("%d",&n)!=EOF){
a1=rd()+1;a2=rd()+1;an=rd();b1=rd()+1;b2=rd()+1;bn=rd();;
for(int i=1;i<=n;++i)scanf("%s",s[i]+1);
tot=1;
memset(head,0,sizeof(head));
for(int i=1;i<=n;++i)
for(int j=1;j<i;++j)
if(s[i][j]=='N')add(i,j,inf);
else if(s[i][j]=='O')add(i,j,1);
add(0,a1,an);add(0,b1,bn);
add(a2,n+1,an);add(b2,n+1,bn);ans=0;
while(bfs(0,n+1))ans+=dfs(0,n+1,inf);
if(ans!=an+bn){puts("No");continue;}
tot=1;
memset(head,0,sizeof(head));
for(int i=1;i<=n;++i)
for(int j=1;j<i;++j)
if(s[i][j]=='N')add(i,j,inf);
else if(s[i][j]=='O')add(i,j,1);
add(0,a1,an);add(0,b2,bn);
add(a2,n+1,an);add(b1,n+1,bn);ans=0;
while(bfs(0,n+1))ans+=dfs(0,n+1,inf);
if(ans!=an+bn){puts("No");continue;}
puts("Yes");
}
return 0;
}

[CQOI2014]危桥的更多相关文章

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

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

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

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

  3. 3504: [Cqoi2014]危桥

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

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

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

  5. 【BZOJ 3504】[Cqoi2014]危桥

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

  6. BZOJ.3504.[CQOI2014]危桥(最大流ISAP)

    BZOJ 洛谷 这种题大多是多源多汇跑网络流.往返\(a_n/b_n\)次可以看做去\(a_n/b_n\)次,直接把危桥能走的次数看做\(1\). 先不考虑别的,直接按原图建模:危桥建双向边容量为\( ...

  7. BZOJ3504 CQOI2014危桥(最大流)

    如果只有一个人的话很容易想到最大流,正常桥连限流inf双向边,危桥连限流2双向边即可.现在有两个人,容易想到给两起点建超源两汇点建超汇,但这样没法保证两个人各自到达自己要去的目的地.于是再超源连一个人 ...

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

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

  9. AC日记——[CQOI2014]危桥 洛谷 P3163

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

随机推荐

  1. C# 把字符串类型日期转换为日期类型(转载)

    C# 把字符串类型日期转换为日期类型   来源:https://www.cnblogs.com/raincedar/p/7009243.html 方法一:Convert.ToDateTime(stri ...

  2. java--基本数据类型的转换(强制转换)

    强制类型的转换 规则: 1.执行算术运算时,低类型(短字节)可以转换为高类型(长字节):例如: int型转换成double型,char型转换成int型等等. 就是用强制类型来实现. 3.强制类型转换语 ...

  3. vue-router 通过路由来实现切换头部标题

    在做单页面应用程序时,一般页面布局头尾两块都是固定在布局页面,中间为是路由入口.这时访问页面时头部标题不会变,该问题的解决方案如下: 通过采用组件内路由卫士(beforeRouterEnter.bef ...

  4. Javascript之高级数组API的使用实例

    JS代码中我们可以根据需求新建新的对象解决问题的同时,也有一些常用的内置对象供我们使用,我们称之为API,本篇文章只是对数组部分进行了练习. 例一:伪数组,不能修改长短的数组(所以没办法清零),可以修 ...

  5. harris角点检测的简要总结

    目录 1. 概述相关 2. 原理详解 1) 算法思想 2) 数学模型 3) 优化推导 3. 具体实现 1) 详细步骤 2) 最终实现 4. 参考文献 1. 概述相关 harris角点检测是一种特征提取 ...

  6. 《.NET 进阶指南》读书笔记2------定义不可改变类型

    不可改变对象的定义 一个类型的对象在创建后,它的状态就不能再改变,知道它死亡,它的状态一直维持与创建时相同.这时候称该对象具有不可改变性.这样的类型为不可改变类型. 不可改变对象在创建的时候,必须完全 ...

  7. adb 查看 android手机的CPU架构

    adb shell cat  /proc/cpuinfo 当然要下载adb并配置好环境变量

  8. 开始食用grpc(之二)

    开始食用grpc(之二) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9570992.html ``` 前段时间有童鞋找我开专栏.搬家.甚至还有人找我写书的. ...

  9. 轻松学习UML之类图,状态图

    本文主要讲解UML图中的类图与状态图相关内容,如有不足之处,还请指正. 概述 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模语言,UML因其简单.统一 ...

  10. C# 实体转为json字符串

    C# 实体转为json字符串 Catalog cata = new Catalog(); cata.C_platformid = 0; cata.C_isnav = 0; cata.C_isvalid ...