树的直径应用

树的毛毛虫形态最大点数问题
这篇博客讨论了一种将树的部分结构抽象为‘毛毛虫’形状的问题。给定一棵树的节点数N和边数M,通过DFS算法找出能够形成最大‘毛毛虫’的节点数,并给出相应的实现代码。文章涉及图论和深度优先搜索算法的应用。

题目描述

对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大。例如下图左边的树(图 11)抽出一部分就变成了右边的一个毛毛虫了(图 22)。

输入格式

输入中第一行两个整数 N, MN,M,分别表示树中结点个数和树的边数。

接下来 MM 行,每行两个整数 a, ba,b 表示点 aa 和点 bb 有边连接(a, b \le Na,b≤N)。你可以假定没有一对相同的 (a, b)(a,b) 会出现一次以上。

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=3e5+5;
int head[maxn];
struct node{
    int to,next;
}edge[maxn<<1];
int cnt=0;
void add_edge(int from,int to)
{
    edge[cnt].to=to;
    edge[cnt].next=head[from];
    head[from]=cnt++;
}
int s;
int du[maxn];
int as=0;
void dfs(int root,int pre,int all)
{
    if(as<all) s=root,as=all;
    for(int i=head[root];i!=-1;i=edge[i].next)
    {
        int to=edge[i].to;
        if(to!=pre)
        {
            dfs(to,root,all+du[to]-2);
        }
    }
}
int main()
{
    int n,m;cin>>n>>m;
    memset(head,-1,sizeof(head));
    for(int i=1;i<=n;i++) du[i]++;
    for(int i=1;i<=m;i++)
    {
        int from,to;cin>>from>>to;
        add_edge(from,to);
        add_edge(to,from);
        du[from]++;
        du[to]++;
    }
    dfs(1,0,du[1]);
    as=0;
    dfs(s,0,du[s]);
    cout<<as<<endl;
}
### 关于直径及其计算 #### 直径定义 直径是指一棵无向连通图中的最长简单路径长度。这里的“最长”指的是边的数量最多或者权值之和最大,具体取决于问题背景[^1]。 #### 基本算法思路 一种常见的求解直径的方法基于两次广度优先搜索 (BFS) 或深度优先搜索 (DFS),其核心思想如下: - 首先从任意节点出发执行一次 BFS/DFS 找到距离最远的一个节点 \( u \)[^2]。 - 接着以该节点 \( u \) 作为起点再次运行 BFS/DFS 来找到另一个距离最远的节点 \( v \) 及对应的路径长度即为直径[^3]。 这种方法的时间复杂度通常为 O(n),其中 n 是顶点数,因为每一步都只遍历整个一次。 #### 实现代码示例 以下是利用 DFS 的 Python 实现来寻找未加权二叉直径: ```python class TreeNode: def __init__(self, val=0, children=None): self.val = val self.children = children if children is not None else [] def dfs(node, parent): max1 = max2 = 0 # Track the top two largest distances for neighbor in node.children: if neighbor != parent: depth = dfs(neighbor, node) if depth > max1: max2 = max1 max1 = depth elif depth > max2: max2 = depth global diameter diameter = max(diameter, max1 + max2) return max1 + 1 diameter = 0 root = ... # Initialize your tree here. dfs(root, None) print("Diameter of Tree:", diameter) ``` 上述代码通过递归方式访问每个子节点并记录下当前分支的最大高度以及次大高度从而更新全局变量 `diameter` 表示最终结果[^4]。 #### 数据结构应用 在实际编程过程中,可以采用邻接表表示稀疏图形式下的结构以便更高效地存储与操作数据;而对于稠密型场景,则可能更适合使用矩阵表达法来进行处理[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值