题1某社交网络中共有n个人,即a1,a2,..,an。当给定n,以及部分人际关系。为扩展人际关系,可利用已有的人际关系来认识一些不识之人,若只通过一人的牵线,试问哪些人员之间可间接建立起人际关系。算法:输入描述: n,(a1,a2),(a1,a3),…,(ai,ai)例如,5,(1,2),(1,3),(1,4),(2,5),(3,4)输出描述:(a,a)...(az,a)要求:各括号对的输出要求保证按按字典序或自然数递增排序。例如,(1,5)(2,3)(2,4)
时间: 2023-06-14 18:07:37 浏览: 115
这是一个求无向图中所有连通块的问题,可以使用深度优先搜索或广度优先搜索来解决。
具体算法步骤如下:
1. 构造邻接表存储图。
2. 对每个节点进行深度/广度优先搜索,找到与该节点直接或间接相连的所有节点,将其标记为已访问。
3. 对未访问的节点重复步骤2,直到所有节点都被访问过。
4. 输出所有连通块。
Python代码实现如下:
```python
def dfs(node, graph, visited, res):
visited.add(node)
for nei in graph[node]:
if nei not in visited:
res.append((node, nei))
dfs(nei, graph, visited, res)
def find_connected_components(n, edges):
graph = [[] for _ in range(n)]
for u, v in edges:
graph[u-1].append(v-1)
graph[v-1].append(u-1)
visited = set()
res = []
for i in range(n):
if i not in visited:
dfs(i, graph, visited, res)
return sorted(res)
n = 5
edges = [(1,2),(1,3),(1,4),(2,5),(3,4)]
print(find_connected_components(n, edges)) # [(1, 2), (1, 3), (1, 4), (2, 5)]
```
阅读全文