Deepest Root

这篇博客主要介绍了如何运用并查集数据结构解决图的连通性问题。首先,通过读入数据初始化并查集,然后构建图的边,并在添加边的同时进行并查集的合并操作。接着,计算连通分量的数量,当连通分量不为1时,输出错误信息。最后,通过两次深度优先搜索找到最长路径,并输出路径上的节点。该文深入浅出地阐述了并查集在解决实际问题中的应用。

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

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=100010;
vector<int>G[N];
bool isRoot[N];
int father[N];
int findFather(int x){
    int a=x;
    while(x!=father[x]){
        x=father[x];
    }
    while(a!=father[a]){
        int z=a;
        a=father[a];
        father[z]=x;
    }
    return x;
}
void Union(int a,int b){
    int faA=findFather(a);
    int faB=findFather(b);
    if(faA!=faB){
        father[faA]=faB;
    }
}
void init(int n){
    for(int i=1;i<=n;i++){
        father[i]=i;
    }
}
int calBlock(int n){
    int Block=0;
    for(int i=1;i<=n;i++){
        isRoot[findFather(i)]=true;
    }
    for(int i=1;i<=n;i++){
        Block+=isRoot[i];
    }
    return Block;
}
int maxH=0;
vector<int>temp,Ans;
void DFS(int u,int Height,int pre){
    if(Height>maxH){
        temp.clear();
        temp.push_back(u);
        maxH=Height;
    }else if(Height==maxH){
        temp.push_back(u);
    }
    for(int i=0;i<G[u].size();i++){
        if(G[u][i]==pre)continue;
        DFS(G[u][i],Height+1,u);
    }
}
int main(){
    int a,b,n;
    scanf("%d",&n);
    init(n);
    for(int i=1;i<n;i++){
        scanf("%d%d",&a,&b);
        G[a].push_back(b);
        G[b].push_back(a);
        Union(a, b);
    }
    int Block=calBlock(n);
    if(Block!=1){
        printf("Error:%d components\n",Block);
    }else{
        DFS(1,1,-1);
        Ans=temp;
        DFS(Ans[0],1,-1);
        for(int i=0;i<temp.size();i++){
            Ans.push_back(temp[i]);
        }
        sort(Ans.begin(),Ans.end());
        printf("%d\n",Ans[0]);
        for(int i=1;i<Ans.size();i++){
            if(Ans[i]!=Ans[i-1]){
                printf("%d\n",Ans[i]);
            }
        }
    }
    return 0;
}

### 关于 PAT 甲级 2023 冬季考试中的分层图题目 在 PAT 甲级考试中,涉及分层图的题目通常围绕图结构展开,可能涉及到 BFS 或 DFS 的应用来解决特定问题。虽然目前尚未提供具体针对 2023 年冬季考试的相关官方资料,但从以往的经验来看,分层图类题目主要考察以下几个方面: #### 图的存储与遍历 为了高效处理大规模数据集(如 N ≤ 10^4),推荐使用邻接表而非邻接矩阵存储图结构[^1]。这种存储方式能够显著减少空间复杂度并提高访问效率。 #### 层次划分方法 当需要计算节点层次或深度时,BFS 是一种常用的选择。通过引入特殊的标记点(例如 `0`)作为层间分隔符,可以在每次迭代结束后轻松识别当前所处的层数。此外,在某些情况下也可以利用嵌套循环的方式逐层处理节点集合[^2]。 #### 应用场景扩展 除了基础的连通性和路径长度分析外,分层图还经常被应用于更复杂的实际问题求解当中。比如: - **最短路问题**:基于不同权重定义构建多阶段网络模型; - **动态规划转移方程设计**:借助分层思想降低状态维度从而简化计算过程; - **资源分配优化**:结合贪心策略合理安排有限资源以满足全局目标约束条件[^3]。 以下是采用 Python 实现的一个简单示例程序片段用于演示如何运用上述技术完成类似任务: ```python from collections import deque, defaultdict def bfs(graph, start_node): visited = set() queue = deque([(start_node, 0)]) # Tuple format: (current_node, level) max_level = -float('inf') while queue: node, level = queue.popleft() if node not in visited: visited.add(node) # Update maximum depth encountered so far. max_level = max(max_level, level) for neighbor in graph[node]: if neighbor != 0 and neighbor not in visited: # Skip the layer separator '0'. queue.append((neighbor, level + 1)) return max_level if __name__ == "__main__": edges = [[1, 2], [1, 3], [2, 4], [3, 5]] adj_list = defaultdict(list) for u, v in edges: adj_list[u].append(v) adj_list[v].append(u) deepest_root_depth = bfs(adj_list, 1) print(f"The deepest root has a depth of {deepest_root_depth}.") ``` 以上代码展示了如何通过广度优先搜索算法找到给定无向图中最深叶子节点所在的高度。 #### 总结 综上所述,解答此类分层图相关的问题需综合考虑多种因素,并灵活选用适当的数据结构和技术手段加以应对。希望这些信息能对你有所帮助! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超翔之逸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值