bzoj2346 & loj2632 [Baltic 2011]Lamp 最短路
题目传送门
https://lydsy.com/JudgeOnline/problem.php?id=2346
题解
普及组难度的题都要想十几分钟,没救了。
对于一条边,将原来就能连起来的两个点之间建一条长度为 \(0\) 的边,翻转以后能连起来的两个点建一条长度为 \(1\) 的边。然后跑最短路就可以了。因为边权只有 \(01\),可以直接 01bfs。
代码如下:
#include<bits/stdc++.h>
#define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to)
#define dbg(...) fprintf(stderr, __VA_ARGS__)
#define File(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define fi first
#define se second
#define pb push_back
template<typename A, typename B> inline char smax(A &a, const B &b) {return a < b ? a = b, 1 : 0;}
template<typename A, typename B> inline char smin(A &a, const B &b) {return b < a ? a = b, 1 : 0;}
typedef long long ll; typedef unsigned long long ull; typedef std::pair<int, int> pii;
template<typename I> inline void read(I &x) {
int f = 0, c;
while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;
x = c & 15;
while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);
f ? x = -x : 0;
}
const int N = 500 + 7;
const int M = N * N;
const int INF = 0x3f3f3f3f;
int n, m;
int q[M << 1], id[N][N], dis[M], vis[M];
char a[N][N];
struct Edge { int to, ne, w; } g[M << 2]; int head[M], tot;
inline void addedge(int x, int y, int z) { g[++tot].to = y, g[tot].w = z, g[tot].ne = head[x], head[x] = tot; }
inline void adde(int x, int y, int z) { addedge(x, y, z), addedge(y, x, z); }
inline void bfs() {
int hd = M, tl = M + 1;
memset(dis, 0x3f, sizeof(dis)), q[tl] = 1, dis[1] = 0;
while (hd < tl) {
int x = q[++hd];
if (vis[x]) continue;
vis[x] = 1;
if (x == id[n + 1][m + 1]) return;
for fec(i, x, y) if (!vis[y] && smin(dis[y], dis[x] + g[i].w))
if (g[i].w) q[++tl] = y;
else q[hd--] = y;
}
}
inline void work() {
int tmp = 0;
for (int i = 1; i <= n + 1; ++i)
for (int j = 1; j <= m + 1; ++j) id[i][j] = ++tmp;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) {
adde(id[i][j], id[i + 1][j + 1], a[i][j] == '/');
adde(id[i + 1][j], id[i][j + 1], a[i][j] == '\\');
}
bfs();
if (dis[id[n + 1][m + 1]] != INF) printf("%d\n", dis[id[n + 1][m + 1]]);
else puts("NO SOLUTION");
}
inline void init() {
read(n), read(m);
for (int i = 1; i <= n; ++i) scanf("%s", a[i] + 1);
}
int main() {
#ifdef hzhkk
freopen("hkk.in", "r", stdin);
#endif
init();
work();
fclose(stdin), fclose(stdout);
return 0;
}
bzoj2346 & loj2632 [Baltic 2011]Lamp 最短路的更多相关文章
- BZOJ2346:[Baltic 2011]Lamp(最短路)
Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...
- 【bzoj2346】[Baltic 2011]Lamp 堆优化Dijkstra
题目描述 2255是一个傻X,他连自己家灯不亮了都不知道.某天TZ大神路过他家,发现了这一情况,于是TZ开始行侠仗义了.TZ发现是电路板的问题,他打开了电路板,发现线路根本没有连上!!于是他强大的脑力 ...
- Bzoj 2346: [Baltic 2011]Lamp dijkstra,堆
2346: [Baltic 2011]Lamp Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 428 Solved: 179[Submit][Sta ...
- 【搜索 ex-BFS】bzoj2346: [Baltic 2011]Lamp
关于图中边权非零即一的宽度优先搜索 Description 译自 BalticOI 2011 Day1 T3「Switch the Lamp On」有一种正方形的电路元件,在它的两组相对顶点中,有一组 ...
- bzoj2346[Baltic 2011]Lamp
Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...
- [Baltic 2011]Lamp BZOJ2346
分析: 建图最短路,比较裸. 我们可以考虑,如果是‘\’那么,左上连右下边权为0,左下连右上边权为1,反之亦然. 卡裸spfa,加点优化能过,我就直接改成的堆优化Dijkstra 附上代码: #inc ...
- 【刷题】BZOJ 2346 [Baltic 2011]Lamp
Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...
- BZOJ 2346: [Baltic 2011]Lamp Dijkstra
不难发现如果一个边的方向改变,就一定不会改回来(这样肯定不是最短路). 所以就直接建双向边,边权为 $0$ 代表不改变,边权为 $1$ 代表改变,跑一个最短路即可. #include <bits ...
- BZOJ2348: [Baltic 2011]Plagiarism
2348: [Baltic 2011]Plagiarism Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 304 Solved: 141[Submit ...
随机推荐
- git使用技巧总结
一.把github上的代码下载下来 git clone ...... 二.把修改的代码提交上去 git add .... git commit -m "........" git ...
- 最最简单的spring mvc + Maven项目
首先配置pom文件,只需要引用三个jar包文件即可: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi ...
- 【Java】ApplicationContext应用上下文工具类
@Slf4j @Service public class SpringContextHolder implements ApplicationContextAware, DisposableBean ...
- [CSP-S模拟测试]:Game(模拟)
题目传送门(内部题62) 输入格式 第一行两个整数$n,K$表示序列长度和游戏数 第二行$n$个数为序列$a_i$ 第三行$K$个数,为$p_i$ 输出格式 输出有$K$行,第$i$行为第$i$次游戏 ...
- 使用CFStringTransform将汉字转换为拼音
之前做通讯录相关的一些App时,有一个比较常用的算法是将汉字转换成拼音.当时采用的做法是:将各个拼音段的首个汉字(按Unicode排序)做成两个数组,一个数组存拼音,另一个数组存拼音对应首个汉字的Un ...
- Share架构的一些心得
个人这些年,从web->system service->app 项目实战,陆陆续续经历的项目很多,自己也数不清.自己也一直对于架构没有明确去给出一个自己的定义描述. 刚好最近一直在flut ...
- 125、TensorFlow计算图的执行
# TensorFlow使用tf.Session类来表示客户端程序之间的链接 # 虽然一个在其他语言中相似的接口也是可以使用的,列如C++ runtime # 一个tf.Session对象提供了访问本 ...
- Jquery浅析
目录 jquery 通过jquery改变标签字体颜色 jquery和js对象之间值转化 Jquery基本选择器 Jquery层级选择器 基本筛选器 操作类属性 模太框 表单筛选器 筛选器方法 设置多个 ...
- 测开之路六十:接口测试平台之common目录
实现接口测试平台使用jsonpath进行取值来断言,效果: 访问页面: 调试功能:http://www.kuaidi100.com/query 保存功能 触发执行功能 查看报告功能 目录结构 comm ...
- SEC1- 数据库的相关概念
一.数据库的好处1. 可以持久化数据到本地2. 结构化查询 二.数据库的常见概念1. DB:data base数据库,存储数据的容器2. DBMS:database management sysy ...