当前位置: 首页 > news >正文

“金山-讯飞”杯2024年武汉理工大学程序设计竞赛 A. Mobiusp败走***(思维题-点双连通分量、连通性)

题目

思路来源

官方题解

题解

手玩发现,能换的话,当且仅当.和1在一个环里,而这就是点双连通分量

所以最优策略是先把.换到(x,y)的位置,然后判断.和1在不在一个环里

也就是:

1. 判断删掉1时,.和(x,y)联通

2. 判断(x,y)和1在同一个连通分量里

这个和三者在同一个连通分量不等价,可以参考下图:

.和1并不在一个点双里,但是可以先把.换到(1,2)的位置里,使之在同一个点双里

3 3

1 2

#**
**1
.##

代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back    
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=1500*1500+5,M=1500*1500*4+5,K=1502;
int n,m,u,v,ex,ey,blk,one,ed;
int low[N],dfn[N],tot,tp,cnt;
vector<P>stk;
bool vis[N];
char s[K][K];
vector<int>e[N];
int f(int x,int y){return x*m+y;
}
void add(int x,int y){e[x].pb(y);
}
bool dfs(int u,int fa){low[u]=dfn[u]=++tot;int ch=0;for(auto &v:e[u]){if(!dfn[v]){stk.pb(P(u,v));//记录当前BCC的边if(dfs(v,u))return 1;ch++;//从u这里向下dfs的子树的数量low[u]=min(low[u],low[v]);if(low[v]>=dfn[u]){//割点ubool ok1=0,ok2=0;for(;;){P x=stk.back();stk.pop_back();int y=x.fi,z=x.se;ok1|=(y==one);ok2|=(y==ed);ok1|=(z==one);ok2|=(z==ed);//printf("one:%d ed:%d\n",y,z);if(ok1 && ok2)return 1;if(y==u && z==v)break;}}}else if(v!=fa && dfn[v]<dfn[u]){stk.pb(P(u,v));low[u]=min(low[u],dfn[v]);}}return 0;
}
bool dfs2(int u){vis[u]=1;if(u==blk)return 1;for(auto &v:e[u]){if(vis[v] || v==one)continue;if(dfs2(v))return 1;}return 0;
}
bool sol(){sci(n),sci(m);sci(ex);sci(ey);ex--;ey--;rep(i,0,n-1){scanf("%s",s[i]);}rep(i,0,n-1){rep(j,0,m-1){if(s[i][j]=='#')continue;int x=f(i,j);if(s[i][j]=='1')one=x;if(s[i][j]=='.')blk=x;if(i-1>=0 && s[i-1][j]!='#'){int y=f(i-1,j);//printf("x:%d y:%d\n",x,y);add(x,y);add(y,x);}if(j-1>=0 && s[i][j-1]!='#'){int y=f(i,j-1);//printf("x2:%d y2:%d\n",x,y);add(x,y);add(y,x);}}}ed=f(ex,ey);if(one==ed)return 1;if(!dfs2(ed))return 0;rep(i,0,n-1){rep(j,0,m-1){if(s[i][j]=='#')continue;int x=f(i,j);if(!dfn[x] && dfs(x,-1))return 1;}}return 0;
}
int main(){puts(sol()?"Yes":"No");return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 51单片机:电脑通过串口控制LED亮灭(附溢出率和波特率详解)
  • SVN 解决冲突
  • 《算法笔记》总结No.6——贪心
  • Elasticsearch:Node.js ECS 日志记录 - Morgan
  • 【全面介绍语言模型的原理,实战和评估】
  • 使用Python绘制气泡图
  • 共话未来 | 人大金仓即将亮相TDBC 2024可信数据库发展大会
  • linux_进程概念——理解冯诺依曼体系结构
  • C基础day8
  • 微软推出全新的学习网站 Microsoft Learn
  • wifi模组Ai-M62-32S的IO映射和UDP透传测试
  • LAZYNVIM学习使用笔记
  • 构造函数语意学(The Semantics of Constructors)
  • Mybatis之动态sql、缓存、分页、配置数据源
  • 防御笔记第四天(持续更新)
  • (三)从jvm层面了解线程的启动和停止
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • css系列之关于字体的事
  • Java 内存分配及垃圾回收机制初探
  • JS笔记四:作用域、变量(函数)提升
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • opencv python Meanshift 和 Camshift
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 删除表内多余的重复数据
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 《天龙八部3D》Unity技术方案揭秘
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​如何在iOS手机上查看应用日志
  • ​虚拟化系列介绍(十)
  • # Java NIO(一)FileChannel
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (C语言)fread与fwrite详解
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (NSDate) 时间 (time )比较
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (翻译)terry crowley: 写给程序员
  • (回溯) LeetCode 40. 组合总和II
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (四)Controller接口控制器详解(三)
  • (四)模仿学习-完成后台管理页面查询
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)创业的注意事项
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET CLR Hosting 简介
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET Micro Framework初体验(二)
  • .net 按比例显示图片的缩略图
  • .NET 反射的使用
  • .NET/C# 项目如何优雅地设置条件编译符号?