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]危桥的更多相关文章

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

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

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

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

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

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

  4. bzoj 3504: [Cqoi2014]危桥

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

  5. bzoj 3504: [Cqoi2014]危桥【最大流】

    妙啊,很容易想到连(s,a1,an)(s,b1,bn)(a2,t,an)(b2,t,bn),这样,但是可能会发生a1流到b2或者b1流到a2这种不合法情况 考虑跑两次,第二次交换b1b2,如果两次都合 ...

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

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

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

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

  8. 【BZOJ 3504】[Cqoi2014]危桥

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

  9. [CQOI2014]危桥

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

随机推荐

  1. [翻译] SACalendar

    SACalendar 效果图: Introducing SACalendar - Easy to use and customizable iOS 7 Calendar SACalendar - 使用 ...

  2. Apache下开启SSI配置,使html支持include包含

    有的时候,我们的页面有公共的导航栏navbar,公共的脚注footer,那么我们就想把这些公共部分独立成一个html文件,在要引用的地方像引用js,css一样,给包含进来. Apache下开启SSI配 ...

  3. matlab 函数句柄@的介绍_什么是函数句柄(转)

    http://blog.csdn.net/kevinhg/article/details/8861774 http://www.ilovematlab.cn/thread-30375-1-1.html ...

  4. 使用 FRP 反向代理实现 Windows 远程连接

    互联网普及率的日渐攀升与 IPv4 资源的持续减少,现在大部分家庭宽带都不会分配公网 IP ,这使一些网络应用的实现多了些困难,像个人的 NAS 和一些智能家居设备.对于分配公网 IP ,各地运营商的 ...

  5. Linux 的计划任务

    Linux操作系统定时任务系统 Cron 入门 cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动 ...

  6. 启动64位 IIS 32位应用程序的支持

    64位的系统可以让IIS在32位的环境下运行asp.net程序,设置方法如下: ASP.NET程序在编译的时候默认是Any CPU,即编译的程序可以在X86.X64系统平台上运行.若希望我们的ASP. ...

  7. 51 nod 1682 中位数计数

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1682 1682 中位数计数 基准时间限制:1 秒 空间限制: ...

  8. CGI编程学习

    @CGI编程学习 目录(?)[+] 一.基本原理 CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口.通过CGI接口,Web服务器就能 ...

  9. BZOJ3160:万径人踪灭(FFT,Manacher)

    Solution $ans=$回文子序列$-$回文子串的数目. 后者可以用$manacher$直接求. 前者设$f[i]$表示以$i$为中心的对称的字母对数. 那么回文子序列的数量也就是$\sum_{ ...

  10. python 二维数组键盘输入

    m = int(input()) grid = [[] for i in range(m)] for i in range(m): line = input().split(' ') for j in ...