求树中最长的路径,第一次bfs找到直径上的一点,第二次找到直径长度
#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
using namespace std;
int t,c,r,x,y;//r为第一坐标,c为第二坐标
string s[2000];
bool judge,flag[2000][2000];
int ans[2000][2000];
int query[2000000][2];
int head,rear;
void bfs(){
while(head<rear){
//cout<<query[head][0]<<" "<<query[head][1]<<endl;
if(query[head][0]-1>=0){
if(!flag[query[head][0]-1][query[head][1]]&&s[query[head][0]-1][query[head][1]]=='.'){
flag[query[head][0]-1][query[head][1]]=true;
//ans[query[head][0]-1][query[head][1]]=ans[query[head][0]][query[head][1]]+1;
query[rear][0]=query[head][0]-1;
query[rear++][1]=query[head][1];
}
}
if(query[head][1]-1>=0){
if(!flag[query[head][0]][query[head][1]-1]&&s[query[head][0]][query[head][1]-1]=='.'){
flag[query[head][0]][query[head][1]-1]=true;
//ans[query[head][0]][query[head][1]-1]=ans[query[head][0]][query[head][1]]+1;
query[rear][0]=query[head][0];
query[rear++][1]=query[head][1]-1;
}
}
if(query[head][0]+1<r){
if(!flag[query[head][0]+1][query[head][1]]&&s[query[head][0]+1][query[head][1]]=='.'){
flag[query[head][0]+1][query[head][1]]=true;
//ans[query[head][0]+1][query[head][1]]=ans[query[head][0]][query[head][1]]+1;
query[rear][0]=query[head][0]+1;
query[rear++][1]=query[head][1];
}
}
if(query[head][1]+1>=0){
if(!flag[query[head][0]][query[head][1]+1]&&s[query[head][0]][query[head][1]+1]=='.'){
flag[query[head][0]][query[head][1]+1]=true;
//ans[query[head][0]][query[head][1]+1]=ans[query[head][0]][query[head][1]]+1;
query[rear][0]=query[head][0];
query[rear++][1]=query[head][1]+1;
}
}
head++;
if(head==rear){
x=query[head-1][0];
y=query[head-1][1];
}
}
}
void bfs2(){
while(head<rear){
//cout<<query[head][0]<<" "<<query[head][1]<<endl;
if(query[head][0]-1>=0){
if(!flag[query[head][0]-1][query[head][1]]&&s[query[head][0]-1][query[head][1]]=='.'){
flag[query[head][0]-1][query[head][1]]=true;
ans[query[head][0]-1][query[head][1]]=ans[query[head][0]][query[head][1]]+1;
query[rear][0]=query[head][0]-1;
query[rear++][1]=query[head][1];
}
}
if(query[head][1]-1>=0){
if(!flag[query[head][0]][query[head][1]-1]&&s[query[head][0]][query[head][1]-1]=='.'){
flag[query[head][0]][query[head][1]-1]=true;
ans[query[head][0]][query[head][1]-1]=ans[query[head][0]][query[head][1]]+1;
query[rear][0]=query[head][0];
query[rear++][1]=query[head][1]-1;
}
}
if(query[head][0]+1<r){
if(!flag[query[head][0]+1][query[head][1]]&&s[query[head][0]+1][query[head][1]]=='.'){
flag[query[head][0]+1][query[head][1]]=true;
ans[query[head][0]+1][query[head][1]]=ans[query[head][0]][query[head][1]]+1;
query[rear][0]=query[head][0]+1;
query[rear++][1]=query[head][1];
}
}
if(query[head][1]+1>=0){
if(!flag[query[head][0]][query[head][1]+1]&&s[query[head][0]][query[head][1]+1]=='.'){
flag[query[head][0]][query[head][1]+1]=true;
ans[query[head][0]][query[head][1]+1]=ans[query[head][0]][query[head][1]]+1;
query[rear][0]=query[head][0];
query[rear++][1]=query[head][1]+1;
}
}
head++;
if(head==rear){
x=query[head-1][0];
y=query[head-1][1];
}
}
}
int main(){
scanf("%d",&t);
while(t--){
head=rear=0;
memset(flag,sizeof(bool),false);
scanf("%d%d",&c,&r);
/*for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
flag[i][j]=false;*/
getchar();
for(int i=0;i<r;i++){
getline(cin,s[i]);
//cout<<s[i]<<endl;
}
judge=true;
for(int i=0;judge&&i<r;i++)
for(int j=0;judge&&j<c;j++)
if(s[i][j]=='.'){
query[rear][0]=i;
query[rear++][1]=j;
flag[query[head][0]][query[head][1]]=true;
judge=false;
}
bfs();
//memset(flag,sizeof(bool),false);
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
flag[i][j]=false;
head=rear=0;
query[rear][0]=x;
query[rear++][1]=y;
flag[query[head][0]][query[head][1]]=true;
memset(ans,sizeof(int),0);
bfs2();
//cout<<ans[x][y]<<endl;
printf("Maximum rope length is %d.\n",ans[x][y]);
}
return 0;
}