zoukankan      html  css  js  c++  java
  • 树的直径(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;
    }

  • 相关阅读:
    函数对象与闭包函数
    day15
    应用在tomcat下的四种部署方式(原创)
    Servlet的四种映射模式
    背景框代码
    RabbitMQ 示例-生产者-消费者-direct-topic-fanout
    idea 设置自动生成注释
    cSpring Boot整合RabbitMQ详细教程
    Windows下RabbitMQ安装及配置
    Threadlocal线程本地变量理解
  • 原文地址:https://www.cnblogs.com/ecustlegendn324/p/11982132.html
Copyright © 2011-2022 走看看