题意

给出一个$n \times m$的网格,每个位置有一个小写字母,初始在$(1, 1)$,每次可以向上下左右走,问走到$(n, m)$的最小花费

设$(x, y)$为当前位置,$(nx, ny)$为下一位置。$s[x][y]$表示$(x, y)$位置的字符。

若$s[x][y] = s[nx][ny]$,则移动的花费为$0$,否则花费为$1$

Sol

01BFS的裸题,感觉这个点子还是很妙的

01BFS可以在$O(n+m)$求出边权只有$0 / 1$的最短路

我们维护一个双端队列,如当前可以进行松弛那么就进行更新,更新完后判断一下,若边权为$1$,则在队尾加入下一个点,否则在队首加入下一个点

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
//#define int long long
using namespace std;
const int MAXN = ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, M;
struct Node {
int x, y, s;
};
deque<Node> q;
int dis[MAXN][MAXN], xx[] = {-, +, , }, yy[] = {, , -, +};
char s[MAXN][MAXN];
void OneZeroBFS() {
q.push_back((Node) {, , });
while(!q.empty()) {
Node p = q.front(); q.pop_front();
for(int i = ; i < ; i++) {
int wx = p.x + xx[i], wy = p.y + yy[i];
int w = (s[wx][wy] != s[p.x][p.y]);
if(dis[wx][wy] > dis[p.x][p.y] + w && (wx > && wy > && wx <= N && wy <= M))
dis[wx][wy] = dis[p.x][p.y] + w,
w == ? q.push_back((Node) {wx, wy, w}) : q.push_front((Node) {wx, wy, w});
}
}
}
main() {
int QwQ = read();
while(QwQ--) {
memset(dis, 0xf, sizeof(dis));
dis[][] = ;
N = read(); M = read();
for(int i = ; i <= N; i++)
scanf("%s", s[i] + );
OneZeroBFS();
printf("%d\n", dis[N][M]);
}
return ;
}
/*
4
2 2
aa
aa
2 3
abc
def
6 6
akaccc
aaacfc
amdfcc
aokhdd
zyxwdp
zyxwdd
5 5
abbbc
abacc
aaacc
aefci
cdgdd
*/

SPOJ KATHTHI - KATHTHI(01BFS)的更多相关文章

  1. SPOJ KATHTHI - KATHTHI

    以前并不知道这个trick. $01BFS$,在$bfs$的时候用一个双端队列来维护,如果边权为$1$就添加到队尾,边权为$0$就添加到队首. 还有一个小trick就是我们可以开一个$dis$数组来代 ...

  2. BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 5217  Solved: 1233 ...

  3. SPOJ DQUERY D-query(主席树)

    题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...

  4. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...

  5. 【填坑向】spoj COT/bzoj2588 Count on a tree

    这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...

  6. SPOJ bsubstr

    题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数. n<=250000 如:abaaa 输出: 4 2 1 1 1 spoj上的时限卡的太严,必须使用O(N)的算法那才 ...

  7. 【SPOJ 7258】Lexicographical Substring Search

    http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...

  8. 【SPOJ 1812】Longest Common Substring II

    http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...

  9. 【SPOJ 8222】Substrings

    http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...

随机推荐

  1. eclipse代码编辑器中按alt+/提示No Default Proposals 的解决方法

    window-> Preferences-> Java-> Editor-> Content Assist-> Advanced 上面的选项卡Select the pro ...

  2. poj2226Muddy Fields——二分图匹配

    题目:http://poj.org/problem?id=2226 把行连通块作为左部点,列连通块作为右部点,行列连通块有相交的格子就连边: 则问题转化为求最小点覆盖,即最大匹配. 代码如下: #in ...

  3. hdu 最短路模板题 java

    最短路 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在 ...

  4. keystone nova v2 python

  5. CentOS 6.5远程连接工具x shell

    安装X shell 在Window系统下远程连接Linux,x shell只是一种远程连接工具,类似工具还有CRT.VNC.putty. 以下是安装X shell的注意事项 此选项中,如不把——初始数 ...

  6. Codeforces Round #408( Div2)

    Bank Hacking 阅读题,读完之后手算一下可以发现每一个bank被hack所需要的strength无非分为三种情况. 1. $a_i$,当且仅当i为第一个选择的点. 2. $a_i+1$,当且 ...

  7. SpringMVC数据绑定二(List、Set和Map类型)

    1.List类型绑定 //联系信息类 用户类的子属性 public class ContactInfo { private String phone; private String address; ...

  8. python 之 staticmethod,classmethod,property的区别

    绑定方法和非绑定方法: 普通def定义的都是绑定给对象的方法,对象调用时会自动传入对象本事,而类调用时需手动传入对象. 加上@classmethod装饰器就是绑定给类的方法,会自动传类本身 加上@st ...

  9. 获取DataGridView上选中的一行并转换为一个DataRow类型

    ataGridViewRow gridrow = dataGridView1.SelectedRows[0]; DataRowView row_view = (DataRowView)gridrow. ...

  10. CSS3 制作魔方 - 玩转魔方

    在上一篇<CSS3 制作魔方 - 形成魔方>中介绍了一个完整魔方的绘制实现,本文将介绍魔方的玩转,支持上下左右每一层独立地旋转.先来一睹玩转的风采. 1.一个问题 由于魔方格的位置与转动的 ...