洛谷3163 CQOI2014危桥 (最大流)
一开始想了一发费用流做法然后直接出负环了
首先,比较显然的思路就是对于原图中没有限制的边,对应的流量就是\(inf\),如果是危桥,那么流量就应该是\(2\)。
由于存在两个起始点,我们考虑直接\(s->a_1,s->b_1\)
然后对于终点,\(a_2->t,b_2->t\)
流量分别是次数的两倍!
(因为往返相当于跑双倍的单程)
然后跑最大流,看一下流量是不是\((2\times (a_n+b_n))\)
但是这样会存在一个瑕疵。就是跑出来的路径是\(a_1->b_2\)
那么这时候,我们选择交换\(b_1和b_2\)的位置,然后重新建图跑最大流。
如果流量还是那个值,那就是\(yes\)。
这是为什么呢?如果两次都是等于\(2\times (a_n+b_n)\),那么只存在两种情况,要么是\(a_1->a_2\)是可行的,要么就是存在\(b1->a1->b2\)这样一条路径且路径的流量是\(2*b_n\),另一边同理。
所以当两次的流量都是合法的时候,那么一定就是\(Yes\),否则就是\(No\)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk make_pair
#define ll long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 3010;
const int maxm = 2e6+1e2;
const int inf = 1e9;
int point[maxn],nxt[maxm],to[maxm];
int flow[maxm],val[maxm];
int cnt=1,n,m;
int pre[maxm],from[maxn];
int dis[maxn],vis[maxn];
int num;
int s,t;
void addedge(int x,int y,int w)
{
nxt[++cnt]=point[x];
to[cnt]=y;
point[x]=cnt;
val[cnt]=w;
}
void insert(int x,int y,int w)
{
addedge(x,y,w);
addedge(y,x,0);
}
int h[maxn];
queue<int> q;
bool bfs(int s)
{
memset(h,-1,sizeof(h));
h[s]=0;
q.push(s);
while (!q.empty())
{
int x=q.front();
q.pop();
for (int i=point[x];i;i=nxt[i])
{
int p = to[i];
if (h[p]==-1 && val[i]>0)
{
q.push(p);
h[p]=h[x]+1;
}
}
}
if (h[t]==-1) return false;
return true;
}
int dfs(int x,int low)
{
if (x==t || low==0) return low;
int totflow=0;
for (int i=point[x];i;i=nxt[i])
{
int p = to[i];
if (h[p]==h[x]+1 && val[i]>0)
{
int tmp = dfs(p,min(low,val[i]));
val[i]-=tmp;
val[i^1]+=tmp;
totflow+=tmp;
low-=tmp;
if(low==0) return totflow;
}
}
if(low>0) h[x]=-1;
return totflow;
}
int dinic()
{
int ans=0;
while (bfs(s))
{
ans=ans+dfs(s,inf);
}
return ans;
}
int a,b,c,d,e,f;
char ss[1010][1010];
void init()
{
cnt=1;
memset(point,0,sizeof(point));
memset(from,0,sizeof(from));
}
int main()
{
while(scanf("%d%d%d%d%d%d%d",&n,&a,&b,&c,&d,&e,&f)!=EOF)
{
init();
a++;
b++;
e++;
d++;
for (int i=1;i<=n;i++)
{
scanf("%s",ss[i]+1);
for (int j=1;j<=n;j++)
{
if (ss[i][j]=='X') continue;
if (ss[i][j]=='O') insert(i,j,2);
if (ss[i][j]=='N') insert(i,j,inf);
}
}
int tag=0;
s=maxn-10;
t=s+1;
insert(s,a,2*c);
insert(b,t,2*c);
insert(s,d,2*f);
insert(e,t,2*f);
if (dinic()==2*(c+f)) tag++;
init();
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if (ss[i][j]=='X') continue;
if (ss[i][j]=='O') insert(i,j,2);
if (ss[i][j]=='N') insert(i,j,inf);
}
}
insert(s,a,2*c);
insert(b,t,2*c);
insert(s,e,2*f);
insert(d,t,2*f);
if (dinic()==2*(c+f)) tag++;
if(tag==2)
{
cout<<"Yes\n";
}
else
{
cout<<"No\n";
}
}
return 0;
}
洛谷3163 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\). 先不考虑别的,直接按原图建模:危桥建双向边容量为\( ...
- bzoj3504: [Cqoi2014]危桥--最大流
题目大意:给张无向图,有两个人a,b分别从各自的起点走向各自的终点,走A,B个来回,图里有些边只能走两次,求问是否能满足a,b的需求 按照题目给的表建图 S连a1,b1 a2,b2连T 跑最大流看是否 ...
- 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再 ...
- [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码
[洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...
- AC日记——[CQOI2014]危桥 洛谷 P3163
题目描述 Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多只能通行两次.A ...
- BZOJ3504 CQOI2014危桥(最大流)
如果只有一个人的话很容易想到最大流,正常桥连限流inf双向边,危桥连限流2双向边即可.现在有两个人,容易想到给两起点建超源两汇点建超汇,但这样没法保证两个人各自到达自己要去的目的地.于是再超源连一个人 ...
随机推荐
- 高德地图&兴趣点(poi)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Nginx 极简入门教程!(转)
基本介绍 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务. Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.r ...
- MySQL基础2——常用命令
注意:MySQL在centos中安装的是5.7版本的,编辑MySQL时会有个报错,需要执行: set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN ...
- 提交Spark作业遇到的NoSuchMethodError问题总结
测试应用说明 测试的Spark应用实现了同步hive表到kafka的功能.具体处理流程: 从 ETCD 获取 SQL 语句和 Kafka 配置信息 使用 SparkSQL 读取 Hive 数据表 把 ...
- Python之win32模块
如果想在Windows操作系统上使用Python去做一些自动化工作,pywin32模块常常会被用到,它方便了我们调用Windows API. 安装及使用 通过命令pip install pywin32 ...
- kubernetes 使用 PV 和 PVC 管理数据存储
文章链接 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的状态)重 ...
- 性能测试工具JMeter 基础(九)—— 测试元件: 逻辑控制器之交替控制器
交替控制器:根据被控制器触发执行次数,去依次执行控制器下的子节点(逻辑控制器.采样器),可以由线程组的线程数.循环次数.逻辑控制器触发. 交替控制器(lnterleave Controller) 简单 ...
- 记一次 .NET 某新能源汽车锂电池检测程序 UI挂死分析
更多高质量干货:参见我的 GitHub: dotnetfly 一:背景 1. 讲故事 这世间事说来也奇怪,近两个月有三位朋友找到我,让我帮忙分析下他的程序hangon现象,这三个dump分别涉及: 医 ...
- vscode安装go插件失败
解决办法:使用golang代理,在环境变量中添加两个新变量: 详情参考vscode中为golang开发环境配置代理goproxy 之后便有一部分可以安装成功
- ysoserial CommonsColletions4分析
ysoserial CommonsColletions4分析 其实CC4就是 CC3前半部分和CC2后半部分 拼接组成的,没有什么新的知识点. 不过要注意的是,CC4和CC2一样需要在commons- ...