[CQOI2014] 危桥

news2024/11/14 15:44:59

[CQOI2014] 危桥

题目描述

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

Alice 希望在岛屿 \(a_1\)\(a_2\) 之间往返 \(a_n\) 次(从 \(a1\)\(a2\) 再从 \(a2\)\(a1\) 算一次往返)。同时,Bob 希望在岛屿 \(b_1\)\(b_2\) 之间往返 \(b_n\) 次。这个过程中,所有危桥最多通行两次,其余的桥可以无限次通行。请问 Alice 和 Bob 能完成他们的愿望吗?

输入格式

本题有多组测试数据。

每组数据第一行包含七个空格隔开的整数,分别为\(N\)\(a_1\)\(a_2\)\(a_n\)\(b_1\)\(b_2\)\(b_n\)
接下来是一个 \(N\)\(N\) 列的对称矩阵,由大写字母组成。矩阵的 \(i\)\(j\) 列描述编号 \(i-1\)\(j-1\) 的岛屿间的连接情况,若为 “O” 则表示有危桥相连:为 “N” 表示有普通的桥相连:为 “X” 表示没有桥相连。

输出格式

对于每组测试数据输出一行,如果他们都能完成愿望输出 “Yes”,否则输出 “No”(不含引号)。

样例 #1

样例输入 #1

4 0 1 1 2 3 1
XOXX
OXOX
XOXO
XXOX
4 0 2 1 1 3 2
XNXO
NXOX
XOXO
OXOX

样例输出 #1

Yes
No

提示

对于所有数据,\(4 \leq N\leq 50,\ 0 \leq a_1, a_2, b_1, b_2 \leq N-1,\ 1 \leq a_n, b_n \leq 50\)

一个显然的思路:把图建出来后,源点向 \(a_1\)\(a_n\) 流量,\(a_2\) 向汇点连 \(a_n\) 流量。\(b\) 同理。然后你会发现会出现 \(a_1\)\(b_2\) 流的情况,所以满流不代表答案为 Yes

然后有结论:源点向 \(b_2\)连边,\(b_1\) 向汇点连边的情况下,如果还是满流,答案一定为 Yes

证明?看下图:

d当中如果两次都满流,大致的流向是这样子,此时如果 \(a_1\)\(b_2\) 有流量,那么 \(a_1->b_1->a_2\) 就是一个符合要求的流。

#include<bits/stdc++.h>
using namespace std;
const int N=55,M=3005;
struct edge{
	int v,nxt,f;
}e[M];
int e_num,f[M],hd[N],vh[N],a0,a1,an,b0,b1,bn,l,r,v[N],q[N],n;
void add_edge(int u,int v,int f)
{
	e[++e_num]=(edge){v,hd[u],f};
	hd[u]=e_num;
}
int bfs()
{
	memcpy(vh,hd,sizeof(hd));
	memset(v,0,sizeof(v));
	v[q[l=r=1]=0]=1;
	while(l<=r)
	{
		for(int i=hd[q[l]];i;i=e[i].nxt)
			if(e[i].f&&!v[e[i].v])
				v[q[++r]=e[i].v]=v[q[l]]+1;
		++l; 
	}
	return v[n+1];
}
int dfs(int x,int fl)
{
	if(x==n+1)
		return fl;
	int k;
	for(int&i=vh[x];i;i=e[i].nxt)
	{
		if(v[e[i].v]==v[x]+1&&e[i].f&&(k=dfs(e[i].v,min(fl,e[i].f))))
		{
			e[i].f-=k,e[i^1].f+=k;
			return k;
		}
	}
	return 0;
}
int dinic()
{
	int k,ans=0;;
	while(bfs())
	{
		while(k=dfs(0,1000000000))
			ans+=k;
	}
	return ans;
}
int main()
{
	while(scanf("%d%d%d%d%d%d%d",&n,&a0,&a1,&an,&b0,&b1,&bn)==7)
	{
		e_num=1;
		memset(hd,0,sizeof(hd));
		++a0,++a1,++b0,++b1;
		for(int i=1;i<=n;i++)
		{
			char ch=getchar();
			while(ch^'O'&&ch^'N'&&ch^'X')
				ch=getchar();
			for(int j=1;j<=n;j++)
			{
				if(i<=j)
				{
					if(ch=='O')
						add_edge(i,j,1),add_edge(j,i,1);
					if(ch=='N')
						add_edge(i,j,1000000000),add_edge(j,i,1000000000);
				}
				ch=getchar();
			}
		}
		add_edge(0,a0,an),add_edge(a0,0,0);
		add_edge(a1,n+1,an),add_edge(n+1,a1,0);
		for(int i=2;i<=e_num;i++)
			f[i]=e[i].f;
		int l0=hd[0],lb0=hd[b0],lb1=hd[b1],lbn=hd[n+1];
		add_edge(0,b0,bn),add_edge(b0,0,0);
		add_edge(b1,n+1,bn),add_edge(n+1,b1,0);
		if(dinic()!=an+bn)
		{
			puts("No");
			continue;
		}
		e_num-=4;
		for(int i=2;i<=e_num;i++)
			e[i].f=f[i];
		hd[0]=l0,hd[b0]=lb0,hd[b1]=lb1,hd[n+1]=lbn;
		add_edge(0,b1,bn),add_edge(b1,0,0);
		add_edge(b0,n+1,bn),add_edge(n+1,b0,0);
		puts(dinic()==an+bn? "Yes":"No");
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【sqli靶场】第二关和第三关通关思路

目录 前言 一、sqli靶场第二关 1.1 判断注入类型 1.2 判断数据表中的列数 1.3 使用union联合查询 1.4 使用group_concat()函数 1.5 爆出users表中的列名 1.6 爆出users表中的数据 二、sqli靶场第三关 2.1 判断注入类型 2.2 观察报错 2.3 判断数据表中的列数 2.4 使用union联合…

电脑出现错误0x80004005怎么解决,解决0x80004005的问题

当电脑出现0x80004005错误时&#xff0c;通常是由于系统或应用程序之间的通信问题或文件系统损坏引起的。该错误代码表示未指定错误&#xff0c;在Windows系统中较为常见。 一.解决0x80004005错误的步骤 重新启动电脑 有时候&#xff0c;错误只是一个暂时的问题&#xff0c;重…

C语言常用字符串

目录 1.什么是字符串 2.如何定义字符串 第3和第4定义的区别&#xff1a;3是字符串变量&#xff0c;4是字符串常量&#xff0c;不予许被修改 3.strlen和sizeof的区别 4.地址分配&#xff08;malloc,realloc,free,memset&#xff09; 案例 5.字符串拷贝(strcpy,strncpy) …

【docker】容器使用(Nginx 示例)

查看 Docker 客户端命令选项 docker上面这三张图都是 常用命令&#xff1a; run 从映像创建并运行新容器exec 在运行的容器中执行命令ps 列出容器build 从Dockerfile构建映像pull 从注册表下载图像push 将图像上载到注册表…

windows启动出现 zookeeper此处不应有java

可能是Java 路径出了问题&#xff0c;这个programFiles直接有空格&#xff0c;没错就有空格&#xff0c;笔者一开始以为这么点算什么空格&#xff0c;需要把这个对应的Java文件到别的英文路径下&#xff0c;并且修改环境变量。就可以启动的。 还可以启动方式有很多种&#xff0…

【操作系统和计网从入门到深入】(二)进程

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记&#xff0c;所以如果是博主比较熟悉的知识点&#xff0c;博主可能就直接跳过了&#xff0c;但是所有重要的知识点&#xff0c;在这个专栏里面都会提到&#xff01;而且我也一定会保证这个专栏知识点的完整性&…

python——第十七天

方法重写(overwrite) 、方法覆盖(override )&#xff1a;在继承的基础上&#xff0c;子类继承了父类的方法&#xff0c;如果不能满足自己使用&#xff0c;我们就可以重写或覆盖该方法 函数重载(overload)&#xff1a; 在强数据类型的编程语言中(如Java、C、C等等): 函数名称…

高通平台开发系列讲解(USB篇)MBIM驱动详解

文章目录 一、数据结构二、源码分析三、adroid_mbim创建四、读写 /dev/adroid_mbim4.1、读gsi_ctrl_dev_read4.2、写gsi_ctrl_dev_write沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍高通平台USB网卡MBIM驱动。 一、数据结构 目录:drivers/usb/gadget/…

Python使用分段函数拟合数据

Python使用分段函数拟合数据 前言前提条件相关介绍实验环境使用分段函数拟合数据代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏…

【LeetCode】每日一题 2023_12_12 下一个更大元素 IV(堆,优先级队列/单调栈)

文章目录 刷题前唠嗑题目&#xff1a;下一个更大元素 IV题目描述代码与解题思路 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 时隔两天&#xff0c;LeetCode 每日一题重新开张&#xff0c;流感已经不能阻挡我的脚步了&#xff01; 题目&#x…

【FAQ】推送前台应用的通知处理功能没生效,如何进行排查?

一、前台应用的通知处理简介 在调用推送接口时可以设置“foreground_show”字段控制前台应用的通知栏消息是否通过NC展示。“foreground_show”默认值为“true”&#xff0c;应用在前台时由NC展示通知栏消息&#xff1b;当设置为“false”时&#xff0c;应用在前台时&#xff…

<习题集><LeetCode><链表><61/83/82/86/92>

目录 61. 旋转链表 83. 删除排序链表中的重复元素 82. 删除排序链表中的重复元素 II 86. 分隔链表 92. 反转链表 II 61. 旋转链表 https://leetcode.cn/problems/rotate-list/ public ListNode rotateRight(ListNode head, int k) {//k等于0&#xff0c;或者head为空&…

高效利用内存资源之动态内存管理详解

目录 一、为什么存在动态内存分配 二、动态内存函数的介绍 2.1malloc 2.2free 2.3calloc 2.4realloc 三、常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟内存使用free释放 3.4使用free释放一块动态开辟内存的一部分 3.…

GNSS 精密单点定位(PPP) 所需数据文件及格式说明

目录 1.PPP所需的数据文件 (1)PPP中必要文件&#xff1a; (2)其他非必要文件&#xff1a; (3)文件示例&#xff1a; 2.数据下载方式 (1)网址下载&#xff1a; (2)GAMP II-GOOD软件下载 1.PPP所需的数据文件 (1)PPP中必要文件&#xff1a; 文件 功能 •观测值文件&…

降采样方法对NCC得分的影响因素评估

定位算法原理 关于不同的定位场景,最适合使用的算法原理,Halcon的原理文档中描述如下: 在图案缩放可用忽略,图案纹理丰富的场景,适合采用基于互相关的匹配。 输入参考图像,搜索图像,参考图像在搜索图像上滑动,得到滑动位置的NCC得分。如下图所示,高于阈值的最亮的地…

【多组学数据驱动的机器学习:生物医学研究的创新与突破】

简介&#xff1a;随着生物医学研究的不断发展&#xff0c;多组学数据在疾病预防、诊断和治疗方面发挥着越来越重要的作用。本文将介绍如何利用机器学习技术对多组学数据进行综合分析&#xff0c;以及这种方法在生物医学研究中的优势和潜力。 正文&#xff1a; 一、多组学数据…

linux搭建seata并使用

搭建seata 官网 在linux下搭建 下载1.6.1版本&#xff1a;地址 新建文件夹、上传压缩包并解压 [roothao ~]# cd /usr/local/software/ [roothao /usr/local/software]# ls canal docker elk gitlab jdk mysql nacos nexus nginx rabbitmq redis redis_sentinel…

【Linux】free命令使用

free命令 ​free是指查看当前系统内存的使用情况&#xff0c;它显示系统中剩余及已用的物理内存和交换内存&#xff0c;以及共享内存和被核心使用的缓冲区。 作者 作者&#xff1a;Brian Edmonds。 语法 free [参数] free 命令 -Linux手册页 命令选项及作用 执行令 &am…

ArcGIS无法绘制一个或多个图层

背景&#xff1a;在导入一份数据时候&#xff0c;arcmap出现无法绘制一个或多个图层的错误&#xff0c;...点数少于要素所要求的的数量&#xff0c;查阅了半天资料发现是制作数据时候拓扑关系错误造成&#xff0c;现将处理方法详细记录如下&#xff1a; 1.原数据&#xff1a; …

如何使用GaussDB创建外表(FOREIGN TABLE)

目录 一、前言 二、创建外表的特点 二、GaussDB创建外表访问外部数据库表&#xff08;示例&#xff09; 1、创建外表 2、FAQ&#xff1a;CREATE USER MAPPING错误 三、GaussDB创建外表映射数据文件&#xff08;示例&#xff09; 1、创建数据文件 2、创建外表 3、FAQ&a…