关于图中边权非零即一的宽度优先搜索

Description

译自 BalticOI 2011 Day1 T3「Switch the Lamp On」
有一种正方形的电路元件,在它的两组相对顶点中,有一组会用导线连接起来,另一组则不会。
有 N×MN\times MN×M 个这样的元件,你想将其排列成 NNN 行 MMM 列放在电路板上。电路板的左上角连接电源,右下角连接灯泡。

试求:至少要旋转多少个正方形元件才能让电源与灯泡连通,若无解则输出 NO SOLUTION。


题目分析

记得之前谁的讲课里提到过这种“ex-BFS”?

只需要在队列拓展的时候稍作更改:边权为一时在队尾插入;边权为零在队头插入。正确性可以由反证法得到。

 #include<bits/stdc++.h>

 struct point
{
int x,y;
point(int a=, int b=):x(a), y(b) {}
};
int n,m,dis[][];
char str[][];
std::deque<point> q; bool legal(int x, int y)
{
return x>=&&y>=&&x<=n&&y<=m;
}
bool check(int x, int y)
{
return str[x][y]=='\\';
}
void update(int x, int y, int v)
{
if (dis[x][y] > v){
dis[x][y] = v;
if (q.empty()||v > dis[q.front().x][q.front().y])
q.push_back(point(x, y));
else q.push_front(point(x, y));
}
}
int main()
{
memset(dis, 0x3f3f3f3f, sizeof dis);
scanf("%d%d",&n,&m);
if ((n+m)%){
puts("NO SOLUTION");
return ;
}
for (int i=; i<=n; i++) scanf("%s",str[i]+);
dis[][] = , q.push_front(point(, ));
while (q.size())
{
point tt = q.front();
q.pop_front();
if (legal(tt.x+, tt.y+)){
if (check(tt.x+, tt.y+))
update(tt.x+, tt.y+, dis[tt.x][tt.y]);
else update(tt.x+, tt.y+, dis[tt.x][tt.y]+);
}
if (legal(tt.x+, tt.y-)){
if (check(tt.x+, tt.y))
update(tt.x+, tt.y-, dis[tt.x][tt.y]+);
else update(tt.x+, tt.y-, dis[tt.x][tt.y]);
}
if (legal(tt.x-, tt.y+)){
if (check(tt.x, tt.y+))
update(tt.x-, tt.y+, dis[tt.x][tt.y]+);
else update(tt.x-, tt.y+, dis[tt.x][tt.y]);
}
if (legal(tt.x-, tt.y-)){
if (check(tt.x, tt.y))
update(tt.x-, tt.y-, dis[tt.x][tt.y]);
else update(tt.x-, tt.y-, dis[tt.x][tt.y]+);
}
}
printf("%d\n",dis[n][m]);
return ;
}

END

【搜索 ex-BFS】bzoj2346: [Baltic 2011]Lamp的更多相关文章

  1. bzoj2346[Baltic 2011]Lamp

    Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...

  2. BZOJ2346:[Baltic 2011]Lamp(最短路)

    Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...

  3. Bzoj 2346: [Baltic 2011]Lamp dijkstra,堆

    2346: [Baltic 2011]Lamp Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 428  Solved: 179[Submit][Sta ...

  4. bzoj2346 & loj2632 [Baltic 2011]Lamp 最短路

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2346 https://loj.ac/problem/2632 题解 普及组难度的题都要想十几分 ...

  5. [Baltic 2011]Lamp BZOJ2346

    分析: 建图最短路,比较裸. 我们可以考虑,如果是‘\’那么,左上连右下边权为0,左下连右上边权为1,反之亦然. 卡裸spfa,加点优化能过,我就直接改成的堆优化Dijkstra 附上代码: #inc ...

  6. 【bzoj2346】[Baltic 2011]Lamp 堆优化Dijkstra

    题目描述 2255是一个傻X,他连自己家灯不亮了都不知道.某天TZ大神路过他家,发现了这一情况,于是TZ开始行侠仗义了.TZ发现是电路板的问题,他打开了电路板,发现线路根本没有连上!!于是他强大的脑力 ...

  7. 【刷题】BZOJ 2346 [Baltic 2011]Lamp

    Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...

  8. BZOJ 2346: [Baltic 2011]Lamp Dijkstra

    不难发现如果一个边的方向改变,就一定不会改回来(这样肯定不是最短路). 所以就直接建双向边,边权为 $0$ 代表不改变,边权为 $1$ 代表改变,跑一个最短路即可. #include <bits ...

  9. BZOJ2348: [Baltic 2011]Plagiarism

    2348: [Baltic 2011]Plagiarism Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 141[Submit ...

随机推荐

  1. su和sudo命令的用法

    为了安全起见,尽量不要用root用户去做所有事情,因为一旦执行了错误的命令,可能会直接导致系统崩溃. 一.su命令 su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,切换到其他用 ...

  2. java并发编程(一)

    java并发编程(一) 线程基础 在Java代码中,单独创建线程,都需要使用类java.lang.Thread,通常可以通过集成并扩展Thread的run()方法,也可以来创建一个Thread,将一个 ...

  3. 百度搜索:有关Baiduspider的10个问题

    猫宁!!! 参考链接: http://help.baidu.com/question?prod_id=99&class=476&id=2996 https://ziyuan.baidu ...

  4. 初识DetNet:确定性网络的前世今生

    在刚刚落幕的2019中国 SDN/NFV/AI大会上,确定性网络(Deterministic Networking)成为了大家讨论的热点话题之一.随着工业物联网(IIoT)的兴起和工业4.0的提出,T ...

  5. 51Nod 1272 最大距离 (栈或贪心)

    #include <cstdio> #include <queue> #include <cstring> #include <iostream> #i ...

  6. 在centos7下搭建nginx环境,并配置负载均衡,最终能达到通过域名直接访问的目的

    1.关于nginx:个人理解的nginx它的主要用途就是负载均衡,当然可能还有其他一些功能可能我们不长用到,我们通过nginx可以干什么呢?为什么要引入它呢?原因是当有高并发访问服务器时,服务器可能会 ...

  7. centos 无界面 服务器 安装chrome部署chromedriver

    转:https://blog.csdn.net/u013849486/article/details/79466359 基本 做完了,要弄进docker里面去了的时候,才搜到 docker-chrom ...

  8. 【模板】平衡树——Treap和Splay

    二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...

  9. Codeforces 1136E(转化+线段树维护)

    题目传送 虽然线段树比较显然但是发现a数组并不好维护.考虑将a转化为好维护的数组b. 方法 这里我将k[1]设为0,对应着\[a[1] + k[1] <= a[2]\]不难得出\[a[i] + ...

  10. js验证textarea里面是否有换行符

    var reg = /[\r\n]+/g;if(reg.test(reason)){ PopAlert("不能有换行符!"); return;}