题目链接:点击打开链接
求树的直径:两次bfs,第一次求出距离根节点最远的节点p,第二次求出距离节点p最远的节点e,用数组pre存路径。
代码:
#include<iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
const int maxn = 105;
int n,m;
vector<int> son[maxn];
bool vis[maxn];
int is_in_diameter[maxn];
int pre[maxn];
bool judge1(int u,int fa){
vis[u] = true;
int cnt = 0;
for(int i=0; i<son[u].size(); i++){
int v = son[u][i];
if(v == fa && cnt == 0) {cnt++;continue;}
if(vis[v]) return false;
if(!judge1(v,u)) return false;
}
return true;
}
struct node{
int num,step;
};
//返回距离s点最远的点编号
int bfs(int s){
int pos = s;
int len = 0;
memset(vis,false,sizeof(vis));
queue<node> q;
node t1,t2;
t1.num = s;
t1.step = 0;
q.push(t1);
vis[s]=true;
while(!q.empty()){
t1 = q.front();
q.pop();
int u = t1.num;
for(int i=0; i<son[u].size(); i++){
int v = son[u][i];
if(!vis[v]){
t2.num = v;
t2.step = t1.step+1;
q.push(t2);
if(len<t2.step){
len = t2.step;
pos = v;
}
vis[v] = true;
pre[v] = u;
}
}
}
return pos;
}
int cal_diameter(int root){
int pos = bfs(root);
pre[pos] = -1;
pos = bfs(pos);
return pos;
}
bool judge2(){
memset(is_in_diameter,0,sizeof(is_in_diameter));
int e = cal_diameter(1);
is_in_diameter[e] = 1;
for(int i=0; i<son[e].size(); i++){
int j = son[e][i];
if(is_in_diameter[j] == 0) is_in_diameter[j] = 2;
}
while (pre[e]!=-1){
e = pre[e];
is_in_diameter[e] = 1;
for(int i=0; i<son[e].size(); i++){
int j = son[e][i];
if(is_in_diameter[j] == 0) is_in_diameter[j] = 2;
}
}
for(int i=1; i<=n; i++){
if(is_in_diameter[i] == 0){
return false;
}
}
return true;
}
int main(){
int kase = 1;
while(scanf("%d",&n)){
if(n == 0) break;
//init
scanf("%d",&m);
memset(vis,false,sizeof(vis));
for(int i=1; i<=100; i++){
son[i].clear();
}
//input
int x,y;
for(int i=1; i<=m; i++){
scanf("%d%d",&x,&y);
son[x].push_back(y);
son[y].push_back(x);
}
//cal
bool f = true;
if(judge1(1,-1)){
for(int i=1; i<=n; i++){
if(!vis[i]) {f = false;break;}
}
if(f){
if(!judge2()) f = false;
}
}
else f = false;
if(f) printf("Graph %d is a caterpillar.\n",kase++);
else printf("Graph %d is not a caterpillar.\n",kase++);
}
return 0;
}