1021 Deepest Root(DFS,连通分量)

A graph which is connected and acyclic can be considered a tree. The hight of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤10​4​​) which is the number of nodes, and hence the nodes are numbered from 1 to N. Then N−1 lines follow, each describes an edge by given the two adjacent nodes' numbers.

Output Specification:

For each test case, print each of the deepest roots in a line. If such a root is not unique, print them in increasing order of their numbers. In case that the given graph is not a tree, print Error: K components where K is the number of connected components in the graph.

Sample Input 1:

5
1 2
1 3
1 4
2 5

Sample Output 1:

3
4
5

Sample Input 2:

5
1 3
1 4
2 5
3 4

Sample Output 2:

Error: 2 components

Analyze:

    We can list the number of connected components to judge whether these nodes can be considered a tree. If the number is greater than 2, we're suppose to print 'Error'. Then we need to use dfs for the second time to record those nodes that are deepest. Actually, we can find some nodes that are deepest at the first time, but we still ignore some nodes. A leaf can be a root.

    For example, 1 - 2 - 3: At the first dfs, you maybe start with node 1, so node 3 will be recorded. In fact, 1 can also be the deepest root. That's why we need secondly dfs.

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>

using namespace std;

int n, max_height;
vector<vector<int>> v;
vector<int> temp;
set<int> s;
bool visited[10001];

void Dfs(int node, int height){
	if(height > max_height){
		temp.clear();
		temp.push_back(node);
		max_height = height;
	}else if(height == max_height){
		temp.push_back(node);
	}
	visited[node] = true;
	for(int i = 0; i < v[node].size(); i++){
		if(visited[v[node][i]] == false)
			Dfs(v[node][i], height + 1);
	}
}

int main(){
	int n1, n2, cnt = 0;
	scanf("%d", &n);
	v.resize(n + 1);
	for(int i = 0; i < n - 1; i++){
		scanf("%d %d", &n1, &n2);
		v[n1].push_back(n2);
		v[n2].push_back(n1);
	}
	for(int i = 1; i <= n; i++){
		if(visited[i] == false){
			Dfs(i, 1);
			if(i == 1){
				if(temp.size() > 0) n1 = temp[0];
				for(int j = 0; j < temp.size(); j++)
					s.insert(temp[j]);
			}
			cnt++;
		}
	}
	if(cnt > 1){
		printf("Error: %d components", cnt);
	}else{
		fill(visited, visited + 10001, false);
		temp.clear();
		Dfs(n1, 1);
		for(int i = 0; i < temp.size(); i++)
			s.insert(temp[i]);
		for(auto it = s.begin(); it != s.end(); it++)
			printf("%d\n", *it);
	}
	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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值