[CQOI2014]危桥
题目描述
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]危桥的更多相关文章
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- Luogu3163 [CQOI2014]危桥 ---- 网络流 及 一个细节的解释
Luogu3163 [CQOI2014]危桥 题意 有$n$个点和$m$条边,有些边可以无限次数的走,有些边这辈子只能走两次,给定两个起点和终点$a_1 --> a_2$(起点 --> 终 ...
- 3504: [Cqoi2014]危桥
3504: [Cqoi2014]危桥 链接 分析: 首先往返的可以转化为全是“往”,那么只要将容量除以2即可. 然后S向a1连边容量为an(除以2之前为2*an),S向a2连边容量为an,b1,b2向 ...
- bzoj千题计划137:bzoj [CQOI2014]危桥
http://www.lydsy.com/JudgeOnline/problem.php?id=3504 往返n遍,即单向2*n遍 危桥流量为2,普通桥流量为inf 原图跑一遍最大流 交换b1,b2再 ...
- 【BZOJ 3504】[Cqoi2014]危桥
Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...
- BZOJ.3504.[CQOI2014]危桥(最大流ISAP)
BZOJ 洛谷 这种题大多是多源多汇跑网络流.往返\(a_n/b_n\)次可以看做去\(a_n/b_n\)次,直接把危桥能走的次数看做\(1\). 先不考虑别的,直接按原图建模:危桥建双向边容量为\( ...
- BZOJ3504 CQOI2014危桥(最大流)
如果只有一个人的话很容易想到最大流,正常桥连限流inf双向边,危桥连限流2双向边即可.现在有两个人,容易想到给两起点建超源两汇点建超汇,但这样没法保证两个人各自到达自己要去的目的地.于是再超源连一个人 ...
- 3504. [CQOI2014]危桥【最大流】
Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...
- AC日记——[CQOI2014]危桥 洛谷 P3163
题目描述 Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多只能通行两次.A ...
随机推荐
- React-组件的生命周期详解(含React16版本)
在一个组件的整个生命周期中,通过用户的交互来更新state或者props,重新渲染组件,更新页面的ui.组成一个简单的"状态机". react的生命周期三个阶段: Mounting ...
- Sharepoint 2013搜索服务配置总结(实战)
分享人:广州华软 星尘 一. 前言 SharePoint 2013集成了Fast搜索,相对于以前版本搜索的配置有了一些改变,在安装部署Sharepoint 2013时可以选择默认创建搜索服务,但有时候 ...
- (七) Keras 绘制网络结构和cpu,gpu切换
视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 首先安装py ...
- Android项目实战(五十三):判断网络连接是否为有线状态(tv项目适配)
一般对于android手机,我们可以通过sdk提供的方法判断网络情况 /** * 获取当前的网络状态 :没有网络-0:WIFI网络1:4G网络-4:3G网络-3:2G网络-2 * 自定义 * * @p ...
- JMeter 接口测试-if控制器
JMeter 接口测试-if控制器 使用场景: 当业务场景是用户登录才能支付操作, 不登录点击支付, 页面会跳转到登录页面. 对于接口也是这样, 一个接口需要执行前, 需要有前提条件, 比如0状态 ...
- HTML导出excel
在博客园找到的相关问题http://q.cnblogs.com/q/12952 还有相关的回答http://www.cnblogs.com/zhouxin/archive/2009/12/11/16 ...
- SQL Server数据库文件与文件组总结
文件和文件组概念 关于文件与文件组,简单概括如下,详情请参考官方文档"数据库文件和文件组Database Files and Filegroups"或更多相关资料: 数据文件概念: ...
- IDEA 最新版永久破解最简单方法(版本 IntelliJ IDEA 2018.3.5)
版权声明:本文为博主原创文章,仅作为学习交流使用,请在阅读后自行删除, 未经博主允许不得转载.https://www.cnblogs.com/linck/p/10522045.html 1.官网下载专 ...
- WIn10系统软件默认安装c盘后消失看不见问题
一.win10系统下c盘,program 文件下 软件一般为32 或者 64位,但是现在win10系统有些C盘会显示program x86 向这种情况的话我们的软件默认安装在这个盘的话可能会造成很多 ...
- [LeetCode] 18. 四数之和
题目链接:https://leetcode-cn.com/problems/4sum/ 题目描述: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个 ...