码迷,mamicode.com
首页 > 其他好文 > 详细

树的重心(DFS)

时间:2019-12-06 00:04:22      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:++   最大   节点   tor   bool   最大值   sub   树的重心   nod   

#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=1e5+10;
vector<int>v[maxn];
int subtree[maxn];//表示每点除去自身所对应的子树大小
bool vis[maxn];//用以标记,去重
int n;
void dfs(int father,int node)//father记录node上一步路径来源
{
  for(int i = 0 ; i < v[node].size() ; i++){
  int son=v[node][i];//son为下一步路径方向
  if(son == father){//避开node对应的父亲节点
    continue;
  }
  dfs(node,son);
  if(vis[son] == true)   continue ;//走过son路径
  subtree[node]+=subtree[son];//统计除去node本身的子树大小
  vis[node]=true;//标记
  }
  subtree[node]=max(subtree[node],n-subtree[node]);//去除node节点,保存两棵子树中的最大值
}
int main(){
  memset(subtree,0,sizeof(subtree));
  memset(vis,false,sizeof(vis));
  cin >> n;
  int a,b;
  for(int i = 1 ; i <= n-1 ; i++){
    cin >> a >> b;
    v[a].push_back(b);//无向树
    v[b].push_back(a);
  }
  dfs(0,1);//任意一点开始dfs,1号节点没有父亲,因而father为0
  int res=maxn;int node=0;
  for(int i = 1 ; i <= n; i++){//求出子树最大规模的最小值
    if(subtree[i] < res){
      res=subtree[i];
      node=i;
    }
  }
  cout << node << " " << res << endl;
  return 0;
}

树的重心(DFS)

标签:++   最大   节点   tor   bool   最大值   sub   树的重心   nod   

原文地址:https://www.cnblogs.com/ecustlegendn324/p/11987399.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!