POJ1383 Labyrinth(树的直径:两次BFS)
2016-05-29 09:49
274 查看
题意:
给一个迷宫,要求迷宫中最长的路径(就是两点之间的距离最大)
要点:
树的直径问题,有两种方法:第一种就是两次BFS:先以任意点搜索一次找到最长段的一端v,再以v搜索找到最长段的另一端w,第二次搜索出的就是最长路径。第二种就是DP,用记忆化搜索应该可以写,以后再说。
给一个迷宫,要求迷宫中最长的路径(就是两点之间的距离最大)
要点:
树的直径问题,有两种方法:第一种就是两次BFS:先以任意点搜索一次找到最长段的一端v,再以v搜索找到最长段的另一端w,第二次搜索出的就是最长路径。第二种就是DP,用记忆化搜索应该可以写,以后再说。
15566071 | Seasonal | 1383 | Accepted | 5128K | 719MS | C++ | 1157B | 2016-05-29 09:33:38 |
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> 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<int> 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; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析