我是靠谱客的博主 忧虑太阳,最近开发中收集的这篇文章主要介绍2207 - 树的中心,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

 

 **2207 - 树的中心 
 **来源:  东方博宜oj   oj.czos.cn


**思路:先求树的直径,再求直径的中间点(即中心)


#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,x,y,k;
int fa[N],dep[N],pre[N];
struct node
{
    int from,to,next;
}a[N*2];               // N*2的原因:无向图
void add(int u,int v)
{
    ++k;
    a[k].from=u;
    a[k].to=v;
    a[k].next=pre[u];
    pre[u]=k;
}
// 深搜求父子关系及深度
void dfs(int x,int f)
{
    fa[x]=f;
    dep[x]=dep[f]+1;
    for(int i=pre[x];i!=0;i=a[i].next)
    {
        if(a[i].to!=f) dfs(a[i].to,x);
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    dfs(1,0);
    x=1;
    for(int i=2;i<=n;i++)
    {
        if(dep[i]>dep[x]) x=i;
    }
    dfs(x,0);
    y=1;
    for(int i=2;i<=n;i++)
    {
        if(dep[i]>dep[y]) y=i;
    }
    // 此时x和y是直径的两个端点
    int d=dep[y];
    if(d%2) //如果深度为奇数,中心点有一个
    {
        for(int i=1;i<=d/2;i++) y=fa[y];
        cout<< y;
    }
    else  //如果深度为偶数,中心点有两个
    {
        for(int i=1;i<=d/2-1;i++) y=fa[y];
        if(y<fa[y]) cout<< y<< " "<< fa[y];
        else cout<< fa[y]<< " "<< y;
    }
    return 0;
}

最后

以上就是忧虑太阳为你收集整理的2207 - 树的中心的全部内容,希望文章能够帮你解决2207 - 树的中心所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部