无向图-已知根节点求高度

无向图-已知根节点求高度_第1张图片

 

深搜板子题,无向图,加边加两个,dfs输入两个参数变量,一个是当前深搜节点,另一个是父节点(避免重复搜索父节点),恢复现场

///首先完成数组模拟邻接表

#include
#include
#include
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;
}

你可能感兴趣的:(算法,深度优先,图论)