【CQOI2014】危桥
【CQOI2014】危桥
Description
Alice和Bob居住在一个由N个岛屿组成的国家,岛屿被编号为\(0\)到\(N-1\)。某些岛屿之间有桥相连,桥上的道路都是双向的,但是一次只能供一人通行。其中一些桥由于年久失修成为危桥,最多只能通行两次。
Alice希望在岛屿\(a1\)和\(a2\)之间往返\(an\)次(从\(a1\)到\(a2\)再从\(a2\)到\(a1\)算一次往返)。同时,Bob希望在岛屿\(b1\)和\(b2\)之间往返\(bn\)次。这个过程中,所有危桥最多通行两次,其余桥可以无限次通行。请问Alice和Bob能完成他们的愿望吗?
Input
本题有多组测试数据。
每组数据第一行包含7个空格隔开的整数,分别是\(N,a1,a2,an,b1,b2,bn\)。
接下来是一个N行N列的对称矩阵,由大写字母组成。矩阵的第i行第j列描述编号i-1和j-1的岛屿间连接情况,若为“O”则表示有危桥相连;为“N”表示有普通桥相连;为“X”表示没有桥相连。
Output
对每组测试数据输出一行,如果他们都能完成愿望输出“Yes”,否则输出“No”。
Sample Input
4 0 1 1 2 3 1
XOXX
OXOX
XOXO
XXOX
4 0 2 1 1 3 2
XNXO
NXOX
XOXO
OXOX
Sample Output
Yes
No
网络流。
首先因为是走来回,所以我们就每找到一条路径就原路返回。所以危桥的容量变成1。
然后我们建\((S,a1,an),(S,b1,bn)\)以及\((a2,T,an),(b2,T,bn)\)。其他的边照常建。
如果满流就能证明可行吗?
反例就是\(a1\)流向\(b2\),\(b1\)流向\(a2\)。
于是我们交换\(b1,b2\),再跑一边网络流,仍然满流就成立。
交换过后万一还是出现了上述的反例呢?我们发现,如果出现这种情况,那么一定有足够的\(a1\)到\(a2\),\(b1\)到\(b2\)的流量。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 55
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n,a[N][N];
int a1,a2,b1,b2;
int an,bn;
struct load {
int to,next;
int flow;
}s[N*N<<1];
int h[N],cnt;
void add(int i,int j,int f) {
s[++cnt]=(load) {j,h[i],f};h[i]=cnt;
s[++cnt]=(load) {i,h[j],0};h[j]=cnt;
}
void Init() {
cnt=1;
memset(h,0,sizeof(h));
}
int S,T;
int dis[N],gap[N];
int dfs(int v,int maxf) {
if(v==T) return maxf;
int ret=0;
for(int i=h[v];i;i=s[i].next) {
int to=s[i].to;
if(s[i].flow&&dis[to]+1==dis[v]) {
int dlt=dfs(to,min(maxf,s[i].flow));
s[i].flow-=dlt;
s[i^1].flow+=dlt;
ret+=dlt;
maxf-=dlt;
if(!maxf||dis[S]==n+2) return ret;
}
}
if(!(--gap[dis[v]])) dis[S]=n+2;
gap[++dis[v]]++;
return ret;
}
bool sap(int a1,int a2,int an,int b1,int b2,int bn) {
Init();
add(S,a1,an),add(S,b1,bn);
add(a2,T,an),add(b2,T,bn);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]==1) add(i,j,1);
else if(a[i][j]==2) add(i,j,1e9);
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
gap[0]=n+2;
int ans=0;
while(dis[S]<=n+2) ans+=dfs(S,1e9);
return ans==an+bn;
}
int main() {
while(scanf("%d",&n)!=EOF) {
a1=Get()+1,a2=Get()+1,an=Get();
b1=Get()+1,b2=Get()+1,bn=Get();
char x;
S=0,T=n+1;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
while(x=getchar(),x!='X'&&x!='O'&&x!='N');
if(x=='O') a[i][j]=1;
else if(x=='N') a[i][j]=2;
else a[i][j]=0;
}
}
int flag=0;
if(sap(a1,a2,an,b1,b2,bn)) {
swap(b1,b2);
flag=sap(a1,a2,an,b1,b2,bn);
}
(flag)?cout<<"Yes\n":cout<<"No\n";
}
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.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...
- [CQOI2014]危桥
题目描述 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 ...
随机推荐
- [nodejs] nodejs开发个人博客(四)数据模型
数据库模型 /model/db.js 数据库操作类,完成链接数据库和数据库的增删查改 查询表 /*查询*/ select:function(tableName,callback,where,field ...
- STL中的Set用法(详+转)
set是STL中一种标准关联容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是标准关联容器),它底层使用平衡的搜索树——红黑树实 ...
- C#设计模式之十九策略模式(Stragety Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第七个模式,该模式是[策略模式],英文名称是:Stragety Pattern.在现实生活中,策略模式的例子也非常常见,例如,在一个公司中,会有各种工作人员 ...
- python爬虫入门urllib库的使用
urllib库的使用,非常简单. import urllib2 response = urllib2.urlopen("http://www.baidu.com") print r ...
- JavaScript Hoisting(提升)
Hoisting 是指 js 在执行代码前,默认会将变量的声明和函数的声明,提升到当前作用域顶端的行为. 这里要注意一下,只提升声明,例如: console.log(a); var a = 10; / ...
- 2018-11-04 在线代码离线翻译Chrome插件"一马"v0.0.14
续前文: 在线代码离线翻译Chrome插件"一马"v0.0.8. 主要改进如下. 项目源码库: program-in-chinese/webextension_github_cod ...
- 被低估的.net(中) - 广州.net俱乐部2019年纲领
这是被低估的.net系列的中篇.上篇在这里:被低估的.net(上) - 微软MonkeyFest 2018广州分享会活动回顾 中篇本来不是这样的,中篇的草稿大纲其实在写上篇之前就写好了,嗯,当时给张队 ...
- Tars 服务调服务
1,创建一个 tars 服务工程 2,把需要调用的服务的 客户端接口文件 拷贝到当前服务 3,构建通信器 CommunicatorConfig 调用,如果是 springboot 开发客户端可以使用注 ...
- git 入门教程之回到过去
回到过去 背景 现在你已经掌握git的基本操作了,文件发生更改首先使用 git add 添加更改,然后 git commit 提交全部更改,当本地文件再次发生更改时,仍然需要git add 和 git ...
- matlab练习程序(地图上画经纬度)
需要看下生成的数据在地球上的经纬度具体位置. 投影为墨卡托投影. clear all; close all; clc; load coast; a=load('out.txt'); %自己的经纬度 ...