深搜板子题,无向图,加边加两个,dfs输入两个参数变量,一个是当前深搜节点,另一个是父节点(避免重复搜索父节点),恢复现场
///首先完成数组模拟邻接表
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10010;
int ha[N],e[2*N],nx[2*N],idx;//数组模拟邻接表
bool vis[N];//标记数组
int n,m;
int ans=0;
int res=0;
void add(int a,int b){
e[idx]=b;
nx[idx]=ha[a];
ha[a]=idx;
idx++;
}
void dfs(int n,int fa){
//进行遍历
for(int i = ha[n]; i !=-1; i=nx[i]){
int j = e[i];
if(j==fa)continue;
if(!vis[j]){
//printf("j=%d, ans=%d \n",j,ans);
ans=ans+1;//加1
vis[j]=1;//标记
dfs(j,n);//下一层
res=max(ans,res);//取最大值
ans--;//恢复现场
vis[j]=0;//恢复
}
}
}
int main(){
scanf("%d%d",&n,&m);
int a,b;
memset(ha,-1,sizeof(ha));
for(int i = 1; i < n; i++){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs(m,-1);
vis[m]=1;
printf("%d\n",res);
return 0;
}