• 树的直径(BFS)


    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<queue>
    #include<cmath>
    using namespace std;
    int data[20][20];
    int route[20];
    bool vis[20];
    int res[20];
    int n;
    int BFS(int i)
    {
      int end;
      memset(res,0,sizeof(res));
      memset(route,0,sizeof(route));
      memset(vis,false,sizeof(vis));
      queue<int>q;
      q.push(i);
      res[i]=1;vis[i]=1;
      while(!q.empty()){
        int root=q.front();
        for(int j = 1 ; j <= n ; j++){
          if(data[root][j] && vis[j]!=1){//确保不访问到父亲节点
            q.push(j);
            route[j]=root;//每个儿子点记录它的父亲
            vis[j]=1;//标记
            res[j]=res[root]+1;//距离起点的步数,最终即求res[]内的max
          }
        }
        end=q.front();
        q.pop();
      }
      return end;//返回最后一个子节点
    }
    int main(){
      cin >> n;//n个点
      int a,b;
      for(int i = 1 ; i <= n-1 ; i++){//n-1条边
        cin >> a >> b;
        data[a][b]=1;
        data[b][a]=1;
      }
      int temp=BFS(1);//第一次BFS从任意点开始,找到直径的其中一个端点
      int t=BFS(temp);//第二次从一个端点出发,BFS找到第二个端点,从而确定直径
      int ans=res[t];
      cout << ans << endl;
      while(t!=temp){
        cout << t << " ";
        t=route[t];//从子节点往前找,最后走回初始节点
      }
      cout << temp << endl;//输出初始节点
      return 0;
    }

  • 相关阅读:
    js禁用回退键
    css和js引用图片路径
    js 文字横向滚动
    数组转换
    Vbox共享串口
    office2003 打开docx文件
    注销退出客户点击回退怎么办
    vs2010 安装mvc3
    修改头像
    iis发布网站局域网无法访问
  • 原文地址:https://www.cnblogs.com/ecustlegendn324/p/11982132.html
Copyright © 2020-2023  润新知