设计算法以实现对无向图G的深度遍历,要求:将每一个连通分量中的顶点以一个表的形式输出。例如,下图的输出结果为:(1,3)(2,6,7,4,5,8)(9,10)【测试用例:物联网工程16级陈霄】 wuxiangtu.png 输入格式: 第一行包含两个整数N、M,表示该图共有N个结点(编号1-N)和M条无向边。(N<=30,M<= 200) (Hint 注意数据规模,任意爆)。 接下来M行每行包含三个整数Xi、Yi,表示有一条的无向边连接结点Xi、Yi 输出格式: 连通分量每行输出一个。 每行一个连通分量按照 该行的第一个元素的大小递增序排列。 在每一行的连通分量包含的点也应该按照元素的大小递增排列输出。 注意每个连通分量用()表示一组连通分量,每两个元素之间用一个,(英文状态,)分割。
时间: 2024-03-14 09:42:59 浏览: 146
算法思路:
1. 构建无向图的邻接表存储结构
2. 从每个未被访问的节点开始进行深度优先遍历
3. 遍历过程中将访问到的节点加入到当前连通分量中
4. 遍历完成后将当前连通分量按照从小到大的顺序输出
5. 重复2-4步骤,直到所有节点都被访问
算法实现:
```python
from collections import defaultdict
def dfs(node, visited, graph, component):
visited[node] = True
component.append(node)
for neighbor in graph[node]:
if not visited[neighbor]:
dfs(neighbor, visited, graph, component)
def find_connected_components(n, m, edges):
graph = defaultdict(list)
visited = [False] * (n+1)
components = []
for u, v in edges:
graph[u].append(v)
graph[v].append(u)
for node in range(1, n+1):
if not visited[node]:
component = []
dfs(node, visited, graph, component)
components.append(component)
for component in components:
component.sort()
print("("+",".join(str(x) for x in component)+")")
if __name__ == "__main__":
n, m = map(int, input().split())
edges = []
for _ in range(m):
u, v = map(int, input().split())
edges.append((u, v))
find_connected_components(n, m, edges)
```
算法分析:
时间复杂度:O(N+M),其中N为图的节点数,M为图的边数。因为每个节点和每条边都会被访问一次。
空间复杂度:O(N+M),因为需要存储图的邻接表和visited数组,以及最多可能的连通分量数。
阅读全文