博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1383 Labyrinth(树的直径:两次BFS)
阅读量:6543 次
发布时间:2019-06-24

本文共 1444 字,大约阅读时间需要 4 分钟。

题意:

给一个迷宫,要求迷宫中最长的路径(就是两点之间的距离最大)

要点:

树的直径问题,有两种方法:第一种就是两次BFS:先以任意点搜索一次找到最长段的一端v,再以v搜索找到最长段的另一端w,第二次搜索出的就是最长路径。第二种就是DP,用记忆化搜索应该可以写,以后再说。

15566071 Accepted 5128K 719MS 1157B 2016-05-29 09:33:38
#include
#include
#include
#include
using namespace std;char map[1005][1005];int dx[4] = { 0,0,1,-1 };int dy[4] = { 1,-1,0,0 };int d[1005][1005];int col, row,fx,fy;int bfs(int x,int y){ int ans = 0; memset(d, -1, sizeof(d)); queue
que; que.push(x); que.push(y); d[x][y] = 0; while (!que.empty()) { x = que.front(); que.pop(); y = que.front(); que.pop(); for (int i = 0; i < 4; i++) { int xx = x + dx[i]; int yy = y + dy[i]; if (d[xx][yy]==-1 && map[xx][yy]=='.' && xx >= 1 && xx <= row&&yy >= 1 && yy <= col) { que.push(xx); que.push(yy); d[xx][yy] = d[x][y] + 1; if (ans < d[xx][yy])//记录最长的位置 { ans = d[xx][yy]; fx = xx; fy = yy; } } } } return ans;}int main(){ int t,i,j; scanf("%d", &t); while (t--) { scanf("%d%d", &col, &row); for (i = 1; i <= row; i++) scanf("%s", map[i] + 1); for (i = 1; i <= row; i++) for (j = 1; j <= col; j++) if (map[i][j] == '.') { fx = i; fy = j; break; } int ans; bfs(fx, fy); //先以任意点搜索一次找到最长段的一端v ans = bfs(fx, fy); //再以v搜索找到最长段的另一端w printf("Maximum rope length is %d.\n", ans); } return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343732.html

你可能感兴趣的文章
win10如何查看激活信息
查看>>
Linux-cp命令
查看>>
Spring中使用JDBC做的增删改查,参考意义极大!
查看>>
expect 使用实例
查看>>
mysql-删除表方式
查看>>
想学前端,为什么不看这些书呢?
查看>>
我的友情链接
查看>>
Web服务自动监控shell
查看>>
java新输入/输出(nio)记录
查看>>
CIE LAB色差公式与 CIE DE 2000色差公式计算类
查看>>
世界上第一块儿硬盘长这样儿,硬盘59年发展史古董老硬盘让人咋舌让人惊叹!...
查看>>
python 中的最大递归层数
查看>>
Adobe Reader显示某些文档字体虚化无法看清的解决方法
查看>>
几个测试计划模板
查看>>
开源中国 2014 最受关注开源软件排行榜 TOP 50
查看>>
[编程题]寻找第K大
查看>>
EXT 从Store中过滤数据 不用知道行号就可以做到
查看>>
记一次mapreduce读取不到输入文件的问题
查看>>
OC之继承
查看>>
Mac远程控制Mac和Windows
查看>>