[CQOI2014][bzoj3504] 危桥 [最大流]
题面
思路
这道题中惟一的特别之处,就在于“危桥”这一个只能走两次的东西
我的第一想法是做一个dp,但是这道题只需要能不能走,也没有必要
网络流?貌似是个很好的选择
我们把所有边作为无向边加入图中,流量上限inf
危桥则作为上限2的无向边
从源点连边到a1b1,汇点连边到a2b2,流量都是2*an或2*bn,相当于一次把两遍走了
最后,只要看看最大流不是(2*an+2*bn)
然而有个问题,万一我们最终求得的最大流中,是a1流到b2、b1流到a2呢?
此时有一个好办法:我们把源点连边到a1b2,汇点连边到a2b1,如果还能满流,就OK了
具体为什么?自己画图理解一下即可~
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1e9
using namespace std;
int n,cnt=-1,first[110],dep[110],cur[110],a1,a2,an,b1,b2,bn;
struct edge{
	int to,next,w;
}a[10010];
inline void add(int u,int v,int w){
	a[++cnt]=(edge){v,first[u],w};first[u]=cnt;
	a[++cnt]=(edge){u,first[v],w};first[v]=cnt;
}
bool bfs(int s,int t){
	int q[110],head=0,tail=1,u,v,i;
	for(i=s;i<=t;i++) dep[i]=-1,cur[i]=first[i];
	q[0]=s;dep[s]=0;
	while(head<tail){
		u=q[head++];
		for(i=first[u];~i;i=a[i].next){
			v=a[i].to;
			if(~dep[v]||!a[i].w) continue;
			dep[v]=dep[u]+1;q[tail++]=v;
		}
	}
	return ~dep[t];
}
int dfs(int u,int t,int limit){
	if(u==t||!limit) return limit;
	int i,v,f,flow=0;
	for(i=first[u];~i;i=a[i].next){
		v=a[i].to;
		if(dep[v]==dep[u]+1&&(f=dfs(v,t,min(limit,a[i].w)))){
			a[i].w-=f;a[i^1].w+=f;
			flow+=f;limit-=f;
			if(!limit) return flow;
		}
	}
	return flow;
}
int dinic(int s,int t){
	int re=0;
	while(bfs(s,t)) re+=dfs(s,t,inf);
	return re;
}
void init(){memset(first,-1,sizeof(first));memset(a,0,sizeof(a));cnt=-1;}
int e[110][110];
int main(){
	int i,j,tmp1,tmp2;char s[110];
	while(~scanf("%d%d%d%d%d%d%d",&n,&a1,&a2,&an,&b1,&b2,&bn)){
		init();a1++;a2++;b1++;b2++;
		for(i=1;i<=n;i++){
			scanf("%s",s);
			for(j=1;j<=n;j++){
				if(s[j-1]=='X') e[i][j]=0;
				if(s[j-1]=='O') e[i][j]=2;
				if(s[j-1]=='N') e[i][j]=1;
			}
		}
		for(i=1;i<=n;i++){
				for(j=i+1;j<=n;j++){
				if(e[i][j]) add(i,j,((e[i][j]==1)?inf:2));
			}
		}
		add(0,a1,an<<1);add(0,b1,bn<<1);add(a2,n+1,an<<1);add(b2,n+1,bn<<1);
		tmp1=dinic(0,n+1);
		init();
		for(i=1;i<=n;i++){
				for(j=i+1;j<=n;j++){
				if(e[i][j]) add(i,j,((e[i][j]==1)?inf:2));
			}
		}
		add(0,a1,an<<1);add(0,b2,bn<<1);add(a2,n+1,an<<1);add(b1,n+1,bn<<1);
		tmp2=dinic(0,n+1);
		if((tmp1!=(an<<1)+(bn<<1))||(tmp2!=(an<<1)+(bn<<1))) puts("No");
		else puts("Yes");
	}
}
												
											[CQOI2014][bzoj3504] 危桥 [最大流]的更多相关文章
- 【CQOI2014】危桥
		
[CQOI2014]危桥 Description Alice和Bob居住在一个由N个岛屿组成的国家,岛屿被编号为\(0\)到\(N-1\).某些岛屿之间有桥相连,桥上的道路都是双向的,但是一次只能供一 ...
 - 【LOJ】#2239. 「CQOI2014」危桥
		
LOJ#2239. 「CQOI2014」危桥 就是先把每条边正着连一条容量为2的边,反着连一条容量为2的边 显然如果只有一个人走的话,答案就是一个源点往起点连一条容量为次数×2的边,终点往汇点连一个次 ...
 - 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\). 先不考虑别的,直接按原图建模:危桥建双向边容量为\( ...
 - 【BZOJ】【3504】【CQOI2014】危桥
		
网络流/最大流 比较裸的最大流= = 无向图上走来回其实就等价与走两遍>_> 如果路径有相交其实不影响答案的 比较恶心的是两个人路过同一座桥,但走的方向不同互相抵消流量了…… 其实只要在第 ...
 - bzoj3504: [Cqoi2014]危桥--最大流
		
题目大意:给张无向图,有两个人a,b分别从各自的起点走向各自的终点,走A,B个来回,图里有些边只能走两次,求问是否能满足a,b的需求 按照题目给的表建图 S连a1,b1 a2,b2连T 跑最大流看是否 ...
 - BZOJ3504 CQOI2014危桥(最大流)
		
如果只有一个人的话很容易想到最大流,正常桥连限流inf双向边,危桥连限流2双向边即可.现在有两个人,容易想到给两起点建超源两汇点建超汇,但这样没法保证两个人各自到达自己要去的目的地.于是再超源连一个人 ...
 - 3504. [CQOI2014]危桥【最大流】
		
Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...
 - 洛谷3163 CQOI2014危桥 (最大流)
		
一开始想了一发费用流做法然后直接出负环了 首先,比较显然的思路就是对于原图中没有限制的边,对应的流量就是\(inf\),如果是危桥,那么流量就应该是\(2\). 由于存在两个起始点,我们考虑直接\(s ...
 
随机推荐
- 【转】iOS 文件下载及断点续传
			
ios的下载我们可以使用的方法有:NSData.NSURLConnection.NSURLSession还有第三方框架AFNetworking和ASI 利用NSData方法和NSURLConnecti ...
 - SSH框架快速搭建(Maven)
			
1.新建Maven项目ssh 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=& ...
 - 题解 P1280 【尼克的任务】
			
传送门 f[i]表示i~n的最长空闲时间: 如果当前无任务就休息一秒(f[i]=f[i+1]+1): 否则f[i]=max(f[i],f[i+当前工作时间]); 用结构体来记录,我们对于每一个时刻开一 ...
 - Oracle10g安装过程中的Configuration Assistant配置失败的问题。
			
前几天安装Oracle的时候碰到了一个小问题,是在最后配置的时候,出现失败提示如下 失败提示:一些 Configuration Assistant 失败.强烈建议您此时重试这些 Configurati ...
 - pthread_cancel函数注意事项
			
/************************************************** 相关函数: #include <pthread.h> int pthread_can ...
 - 1005: [HNOI2008]明明的烦恼
			
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6539 Solved: 2558[Submit][Status][Discuss] Descripti ...
 - 关于html标签的两种隐藏方式
			
做一个文章管理模块 有一个功能是需要根据文章分类来显示内容的标签 刚开始以为很简单 ,手放键盘上就是一顿敲. 如果类型是文章就是没问题 可是另外几种就有问题了 红框的标签一直不出来 后来找了半天然来 ...
 - 关于union的一些问题
			
创建一个测试数据表 CREATE TABLE `temp_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT ...
 - C盘扩容 更改C盘大小
			
最近对xamarin有点兴趣,虽然网上的评论嘘声一片, 对于只想试一试的心态来说,对于网上所说的什么开发后的程序卡顿,可以用的三方库很少等, 我只想说,你们说的我不信,我要试一试看 我本来已经安装了v ...
 - java util - base64转换工具
			
测试代码 package cn.java.codec.base64; public class Test { public static void main(String[] args) { Stri ...