URAL 1056 Computer net [DFS求树的中心]

这是一篇关于如何使用深度优先搜索(DFS)在给定树结构中找到树中心的博客。树的中心定义为距离所有节点最近的点,最多有两个。文章通过两次DFS操作,首先找到树中最远的节点,然后从这个节点出发再次DFS找出最远点,以此确定树的直径,并输出中心节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给定一棵树,求树的中心(即到各结点的距离最小)。若存在多个,按顺序输出。(至多两个,依据树的性质)。

思路:树的中心必然为其直径的中点,利用两个DFS求直径的两个结点及其直径长,DFS(1)求出树的最远结点,DFS(2)以该结点为起始,寻找离该结点的最远点,依据直径长循环,输出中点。

#include <iostream>
#include <vector>
#define  maxn 10010
using namespace std;
vector <int> tree[maxn];
int n,v,l,parent[maxn];
bool visit[maxn];
void DFS(int x,int father,int deep){
    visit[x]=1;
    parent[x]=father;
    if(deep>l){
        l=deep;
        v=x;
    }
    for(int i=0;i<tree[x].size();i++){
        int child=tree[x][i];
        if(visit[child]) continue;
        DFS(child,x,deep+1);
    }
}
int main(){
    int i,j;
    while(cin>>n){
        for(i=1;i<n;i++){
            cin>>j;
            tree[i+1].push_back(j);
            tree[j].push_back(i+1);
        }
        memset(visit,0,sizeof(visit));
        v=0;
        l=0;
        DFS(1,0,1);//此时的v(1)为树的最远点,长度l为根至v的长度
        memset(visit,0,sizeof(visit));
        l=0;
        DFS(v,0,1);//此时的v(2)为离v(1)的最远点,长度l为v(1)至v(2)的长度
        for(i=1;i<l/2;i++)
            v=parent[v];
        if(l%2) cout<<parent[v]<<endl;
        else cout<<min(v,parent[v])<<" "<<max(v,parent[v])<<endl;
        for(i=0;i<=n;i++) tree[i].clear();
    }
    return 0;
}
/*测试:
Sample Input
5
1
1
2
2
Sample Output
1 2
*/


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值