HOJ 1030 Labyrinth----------------两次BFS求树的直径
[cpp]//题意:求树的直径//思路:// 树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径;// 原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点// 证明: 1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)// 2) 如果u不是直径上的点,则u到v必然于树的直径相交(反证),那么交点到v 必然就是直径的后半段了// 所以v一定是直径的一个端点,所以从v进行BFS得到的一定是直径长度//hint:。。。。。#include<iostream>#include<cstring>#include<cstdio>#include<queue>#define maxlen 1010struct node{int x,y,step;};char mat[maxlen][maxlen];int mat2[maxlen][maxlen],maxt;int dir[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};using namespace std;node BFS1(node s,int a,int b)//任意一个点找到直径的另一点(以这个点为起点的最长路的终点){queue<node> q;node ol,ne,ans;while(!q.empty()) q.pop();maxt=-1;//当前最大步子记录s.step=0;mat[s.x][s.y]='#';q.push(s);while(!q.empty()){ol=q.front();q.pop();if(ol.step>maxt){maxt=ol.step;ans=ol;}//出队就要判断for(int l=0; l<4; l++){ne.x=ol.x+dir[l][0];ne.y=ol.y+dir[l][1];ne.step=ol.step;if(ne.x>a||ne.y>b||ne.x<0||ne.y<0||mat[ne.x][ne.y]=='#')continue;else{mat[ne.x][ne.y]='#';ne.step++;if(ne.step>maxt){maxt=ne.step;ans=ne;}//更新之后要判断q.push(ne);}}}return ans;}node BFS2(node s,int a,int b){queue<node> q;node ol,ne,ans;while(!q.empty()) q.pop();maxt=-1;s.step=0;mat2[s.x][s.y]=1;q.push(s);while(!q.empty()){ol=q.front();q.pop();if(ol.step>maxt){maxt=ol.step;ans=ol;}for(int l=0; l<4; l++){ne.x=ol.x+dir[l][0];ne.y=ol.y+dir[l][1];ne.step=ol.step;if(ne.x>a||ne.y>b||ne.x<0||ne.y<0||mat2[ne.x][ne.y]==1)continue;else{mat2[ne.x][ne.y]=1;ne.step++;if(ne.step>maxt){maxt=ne.step;ans=ne;}q.push(ne);}}}return ans;}//同BFS1int main(){int n,a,b,i,j;node s;cin >> n;while(n--){memset(mat,'0',sizeof(mat));memset(mat2,0,sizeof(mat2));cin >> b >> a;for(i=0;i<a;i++)for(j=0;j<b;j++)cin >> mat[i][j];for(i=0; i<a; i++)for(j=0; j<b; j++)if(mat[i][j]=='#')mat2[i][j]=1;bool f=false;for(i=0; i<a; i++){for(j=0; j<b; j++){ www.zzzyk.com&n补充:软件开发 , C++ ,
上一个:Windows程序运行原理
下一个:(地基工)为什么整数可以转换为指针
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊