3504: [Cqoi2014]危桥

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1407  Solved: 703
[Submit][Status][Discuss]

Description

Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1。某些岛屿之间有桥相连,桥上的道路是双
向的,但一次只能供一人通行。其中一些桥由于年久失修成为危桥,最多只能通行两次。Alice希望在岛屿al和a2之间往返an次(从al到a2再从a2到al算一次往返)。同时,Bob希望在岛屿bl和b2之间往返bn次。这个过程中,所有危桥最多通行两次,其余的桥可以无限次通行。请问Alice和Bob能完成他们的愿望吗?

Input

本题有多组测试数据。
每组数据第一行包含7个空格隔开的整数,分别为N、al、a2、an、bl、b2、bn。
接下来是一个N行N列的对称矩阵,由大写字母组成。矩阵的i行j列描述编号i一1和j-l的岛屿间的连接情况,若为“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
数据范围
4<=N<50
O<=a1, a2, b1, b2<=N-1
1 <=an. b<=50

双向图,往返=走好几次--流量
危桥c=2,普通c=INF
s--an-->a1   a2--an-->t
  --bn-->b1  b2--bn-->t
看是否满流即可
但是有个问题,a1的流量可能流到b2,同时b1的到a2
于是,交换b1和b2的位置,再做一遍最大流看是否满流,满流则可行
为什么呢?
linkct讲课说,两个流f1和f2可行,|f1+f2|/2也可行(平均都小于每一个)
证明具体忘了,自己又想了一下,不一定对
考虑前后两次流,
第一次:f1
a1-->a2  an-x
b1-->b2  an-x
a1-->b2 x
a2-->b1 x
第二次:f2
a1-->a2  an-x
b2-->b1  an-x
a1-->b1  x
b2-->a2  x
相加|f1+f2|/2:  f(a1,a2)=an-x  f(b1,b2)=0  f(a1,a2)=x  所以f(a1,a2)=an
实现上的问题:
1.老老实实的重构图
2.老老实实的保存边容量 g[i][j]=0!!!
3.双向图反向边c=c就行了
4.+1 *2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=55,INF=1e9;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}return x*f;
}
int n,a1,a2,an,b1,b2,bn,s,t;
int g[N][N];
int tot;
char ss[N];
struct edge{int v,ne,c,f;
}e[N*N<<1];
int cnt,h[N];
inline void ins(int u,int v,int c){cnt++;e[cnt].v=v;e[cnt].c=c;e[cnt].f=0;e[cnt].ne=h[u];h[u]=cnt;cnt++;e[cnt].v=u;e[cnt].c=c;e[cnt].f=0;e[cnt].ne=h[v];h[v]=cnt;
}
int q[N],head,tail,vis[N],d[N];
bool bfs(){memset(vis,0,sizeof(vis));memset(d,0,sizeof(d));head=tail=1;q[tail++]=s;d[s]=0;vis[s]=1;while(head!=tail){int u=q[head++];for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(!vis[v]&&e[i].c>e[i].f){vis[v]=1;d[v]=d[u]+1;if(v==t) return true;q[tail++]=v;}}}return false;
}int cur[N];
int dfs(int u,int a){if(u==t||a==0) return a;int flow=0,f;for(int &i=cur[u];i;i=e[i].ne){int v=e[i].v;if(d[v]==d[u]+1&&(f=dfs(v,min(a,e[i].c-e[i].f)))>0){flow+=f;e[i].f+=f;e[((i-1)^1)+1].f-=f;a-=f;if(a==0) break;}}return flow;
}
int dinic(){int flow=0;while(bfs()){for(int i=s;i<=t;i++) cur[i]=h[i];flow+=dfs(s,INF);}return flow;
}
int th[N],tc;
bool solve(){s=0;t=n+1;ins(s,a1,an);ins(s,b1,bn);ins(a2,t,an);ins(b2,t,bn);int ans=dinic();//printf("ans1 %d\n",ans);if(ans!=an+bn) return false;cnt=0;memset(h,0,sizeof(h));for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++) if(g[i][j]) ins(i,j,g[i][j]);ins(s,a1,an);ins(s,b2,bn);ins(a2,t,an);ins(b1,t,bn);ans=dinic();//printf("ans2 %d\n",ans);if(ans!=an+bn) return false;return true;
}
int main(){//freopen("in.txt","r",stdin);while(scanf("%d",&n)!=EOF){a1=read()+1;a2=read()+1;an=read()*2;b1=read()+1;b2=read()+1;bn=read()*2;cnt=0;memset(h,0,sizeof(h));for(int i=1;i<=n;i++){scanf("%s",ss+1);for(int j=i+1;j<=n;j++){if(ss[j]=='O') ins(i,j,2),g[i][j]=2;else if(ss[j]=='N') ins(i,j,INF),g[i][j]=INF;else g[i][j]=0;}}if(solve()) puts("Yes");else puts("No");}
}

转载于:https://www.cnblogs.com/candy99/p/6241419.html

BZOJ 3504: [Cqoi2014]危桥 [最大流]相关推荐

  1. bzoj 3504: [Cqoi2014]危桥(最大流)

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1660  Solved: 823 [Submit][Statu ...

  2. [CQOI2014]危桥

    [CQOI2014]危桥 有点神仙的最大流 在Ta的博客查看 就是这样做,(F1+F2)/2后对应a的走法,(F1-F2)/2后对应b的走法 可以拼凑出合法的增广路,并且两者不会相交(整体除以2容量认 ...

  3. P3163 [CQOI2014]危桥

    传送门 我是看不出这玩意儿和网络流有什么关系-- 我们把图中的所有边都当成无向边加入图中,容量为\(inf\) 危桥的容量为\(2\) 从源点到\(a1,b1\)连边容量为\(an*2\),\(a2, ...

  4. JZOJ 3597. 【CQOI2014】危桥

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

  5. BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...

  6. BZOJ 4946: [Noi2017]蔬菜 模拟费用流

    title BZOJ 4946 LUOGU 3826 简化题意: 定义了一种蔬菜为:\(ai,si,ci,xi\),意思是蔬菜的价格为 \(a_i\),第一份卖出时价格为 \(a_i+s_i\),一共 ...

  7. [BZOJ 2424][HAOI2010]订货(费用流)

    Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为 ...

  8. bzoj 3503: [Cqoi2014]和谐矩阵(高斯消元)

    3503: [Cqoi2014]和谐矩阵 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Submit: 1101  Solved ...

  9. bzoj 1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4116  Solved: 2081 [Submit][Statu ...

最新文章

  1. mysql char 和varchar哪种效率高_MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么?...
  2. matlab二维画图函数汇总--论文,数学建模中使用
  3. mysql数据库连接过多的错误,可能的原因分析及解决办法
  4. Access数据库出现的0x80004005 Unspecified error问题
  5. python3的3D开发-基于blender(1)
  6. [Leetcode][JAVA][第1111题][栈思想]
  7. 静物摄影用光技巧_摄影技巧:摄影如何用光?摄影大师总结的10点,非常受用!...
  8. J2EE实现发送邮件功能
  9. 判断整除(动态规划,递推)
  10. MAC安装linux双系统
  11. idea运行前端项目
  12. CentOS安装锐捷认证客户端
  13. android 年月日倒计时,手机日期倒计时
  14. matlab函数的线性化,[原创]非线性Simulink模型线性化方法讨论
  15. 用IO流读取trs文件
  16. 在微软官方网站”满速”下载Windows10最新系统镜像方法。
  17. 《黑客帝国 THE MATRIX》——当你生活在代码的虚拟世界中
  18. 分享一下我做教程用的GIF动态图制作小工具screentogif
  19. java学习总结(16.06.07)类的静态成员和非静态成员
  20. [枚举] COGS 1580 [WC2005]友好的生物

热门文章

  1. MIL for PRE
  2. 【IM】关于集成学习Bagging和Boosting的理解
  3. 网络爬虫介绍||为什么学网络爬虫
  4. Servlet流程总结
  5. jQuery知识点笔记-常用方法
  6. Python+selenium 自动化-调用dom节点的click()监听事件,强力操作节点,穿透元素进行点击,节点被遮挡不可点击解决方法
  7. C#中RichTextBox文本居中显示
  8. [YTU]_2916(Shape系列-2)
  9. Python基础09 面向对象的进一步拓展
  10. 二进制中1的个数(2)