3504: [Cqoi2014]危桥
3504: [Cqoi2014]危桥
分析:
首先往返的可以转化为全是“往”,那么只要将容量除以2即可。
然后S向a1连边容量为an(除以2之前为2*an),S向a2连边容量为an,b1,b2向T连边容量为bn。原图上的边,建双向边保存。
这样会存在从a1流向b2的流量,当然也有b1流向a2的流量,考虑如何判断这种情况。
将b1,b2交换,然后重新跑一遍,判断是否满流即可。
第一遍最大流的时候,假设a1->b2流了x的流量,那么有
a1->a2:an-x,
a1->b2:x,
b1->b2:bn-x
b1->a2:x
交换b1和b2之后,一定有
a1->a2:an-x
b2->b1:bn-x
因为这是双向边。那么如果此时仍然满流,说明a1->b1:x,a2可以向b1流x的流量,结合第一个a1可以向b2流x的流量,那么如果将第一次的a1向b2流的流量,流向b1,那么就合法了。
还有一个小问题,SovietPower提到的。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = , INF = 1e9;
struct Edge{ int to, nxt, cap; } e[];
int head[N], dis[N], q[N], cur[N];
char s[N][N];
int En, S, T, n, a1, a2, an, b1, b2, bn; inline void add_edge(int u,int v,int w) {
++En; e[En].to = v, e[En].cap = w, e[En].nxt = head[u]; head[u] = En;
++En; e[En].to = u, e[En].cap = , e[En].nxt = head[v]; head[v] = En;
}
bool bfs() {
for (int i = ; i <= T; ++i) dis[i] = -, cur[i] = head[i];
int L = , R = ;
q[++R] = S, dis[S] = ;
while (L <= R) {
int u = q[L ++];
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (dis[v] == - && e[i].cap > ) {
dis[v] = dis[u] + ;
q[++R] = v;
if (v == T) return ;
}
}
}
return ;
}
int dfs(int u,int flow) {
if (u == T) return flow;
int used = ;
for (int &i = cur[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (dis[v] == dis[u] + && e[i].cap > ) {
int tmp = dfs(v, min(flow - used, e[i].cap));
if (tmp > ) {
e[i].cap -= tmp, e[i ^ ].cap += tmp;
used += tmp;
if (used == flow) break;
}
}
}
if (used != flow) dis[u] = -;
return used;
}
int dinic() {
int ans = ;
while (bfs()) ans += dfs(S, INF);
return ans;
}
void build() {
En = ; memset(head, , sizeof(head));
add_edge(S, a1, an);add_edge(S, b1, bn);
add_edge(a2, T, an);add_edge(b2, T, bn);
for (int i = ; i <= n; ++i)
for (int j = i + ; j <= n; ++j)
if (s[i][j] == 'O') add_edge(i, j, ), add_edge(j, i, );
else if (s[i][j] == 'N') add_edge(i, j, INF), add_edge(j, i, INF);
}
void solve() {
S = , T = n + ;
a1 = read() + , a2 = read() + , an = read();
b1 = read() + , b2 = read() + , bn = read();
for (int i = ; i <= n; ++i) scanf("%s", s[i] + );
build();
if (dinic() != an + bn) { puts("No"); return ; }
swap(b1, b2);
build();
if (dinic() != an + bn) { puts("No"); return ; }
puts("Yes");
}
int main() {
while (~scanf("%d", &n)) solve();
return ;
}
3504: [Cqoi2014]危桥的更多相关文章
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- BZOJ.3504.[CQOI2014]危桥(最大流ISAP)
BZOJ 洛谷 这种题大多是多源多汇跑网络流.往返\(a_n/b_n\)次可以看做去\(a_n/b_n\)次,直接把危桥能走的次数看做\(1\). 先不考虑别的,直接按原图建模:危桥建双向边容量为\( ...
- 3504. [CQOI2014]危桥【最大流】
Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...
- bzoj 3504: [Cqoi2014]危桥
#include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...
- bzoj 3504: [Cqoi2014]危桥【最大流】
妙啊,很容易想到连(s,a1,an)(s,b1,bn)(a2,t,an)(b2,t,bn),这样,但是可能会发生a1流到b2或者b1流到a2这种不合法情况 考虑跑两次,第二次交换b1b2,如果两次都合 ...
- bzoj千题计划137:bzoj [CQOI2014]危桥
http://www.lydsy.com/JudgeOnline/problem.php?id=3504 往返n遍,即单向2*n遍 危桥流量为2,普通桥流量为inf 原图跑一遍最大流 交换b1,b2再 ...
- Luogu3163 [CQOI2014]危桥 ---- 网络流 及 一个细节的解释
Luogu3163 [CQOI2014]危桥 题意 有$n$个点和$m$条边,有些边可以无限次数的走,有些边这辈子只能走两次,给定两个起点和终点$a_1 --> a_2$(起点 --> 终 ...
- 【BZOJ 3504】[Cqoi2014]危桥
Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...
- [CQOI2014]危桥
题目描述 Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多只能通行两次. ...
随机推荐
- [翻译] DBCamera 轻量级定制摄像头
DBCamera 轻量级定制摄像头 https://github.com/danielebogo/DBCamera DBCamera is a simple custom camera with AV ...
- 详细讲解WaterRefreshLoadMoreView的使用
详细讲解WaterRefreshLoadMoreView的使用 效果图: 加载控件的源码在如下网址中:上拉加载下拉刷新控件WaterRefreshLoadMoreView 使用的源码: // // V ...
- Windows10自动更新之后,无线有线都连不上网
大概浪费了我至少6个小时. 一个是无线网卡,这个后来可以修复,其实也不是网卡的原因.最主要的原因是 Realtek PCIe GBE Family Controller 这个驱动.只找到一个win1 ...
- 张高兴的 Windows 10 IoT 开发笔记:0.96 寸 I2C OLED
This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub:https://github.co ...
- Eclipse Debug Daemon Thread
Daemon Thread ["http-bio-8080"-exec-2] (Suspended (exception RuntimeException)) ThreadPool ...
- rimraf命令 递归删除目录所有文件
使用webpack build文件项目时每次都会生成一个dist目录,有时需要把dist目录里的所以旧文件全部删掉, 除了可以使用rm -rf /dist/命令删除外,还可以使用rimraf /dis ...
- MySQL(27):行锁、表锁、乐观锁、悲观锁
1. 首先说一下:行锁 和 表锁 主要是针对锁粒度划分的. 一般分为:行锁.表锁.库锁 (1)行锁:访问数据库的时候,锁定整个行数据,防止并发错误. (2)表锁:访问数据库的时候,锁定整个表数据,防 ...
- 【bzoj4543】[POI2014]Hotel加强版
题目 抄题解.jpg 发现原来的\(O(n^2)\)的换根\(dp\)好像行不通了呀 我们考虑非常牛逼的长链剖分 我们设\(f[x][j]\)表示在\(x\)的子树中距离\(x\)为\(j\)的点有多 ...
- 【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别
Class对象的生成方式如下: 1.类名.class 说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Cla ...
- 第二部分 OpenStack安装与配置
第二部分 OpenStack安装与配置 一.引言 本章内容讲解如何在3台物理机上搭建最小化云平台,这3台机器分为称为Server1.Server2和Client1,之后的各章也是如此.Server ...