105. 有向图的完全联通
105. 有向图的完全联通
题目描述
给定一个有向图,包含 N 个节点,节点编号分别为 1,2,...,N。现从 1 号节点开始,如果可以从 1 号节点的边可以到达任何节点,则输出 1,否则输出 -1。
输入描述
第一行包含两个正整数,表示节点数量 N 和边的数量 K。 后续 K 行,每行两个正整数 s 和 t,表示从 s 节点有一条边单向连接到 t 节点。
输出描述
如果可以从 1 号节点的边可以到达任何节点,则输出 1,否则输出 -1。
输入示例
4 4
1 2
2 1
1 3
2 4
输出示例
1
提示信息
从 1 号节点可以到达任意节点,输出 1。
数据范围:
1 <= N <= 100;
1 <= K <= 2000。
DFS实现
import collections
def dfs_search(startIndex, n, edges, visited):
visited[startIndex] = True
is_all_visited = True
for i in range(1, n+1):
if not visited[i]:
is_all_visited = False
if is_all_visited:
return
for next_index in edges[startIndex]:
if not visited[next_index]:
dfs_search(next_index, n, edges, visited)
if __name__ == '__main__':
n, k = map(int, input().split())
edges = collections.defaultdict(list)
for _ in range(k):
s, t= map(int, input().split())
edges[s].append(t)
visited = [False] * (n + 1)
dfs_search(1, n, edges, visited)
isAllVisited = True
for i in range(1, n + 1):
if not visited[i]:
isAllVisited = False
if isAllVisited:
print(1)
else:
print(-1)
BFS实现
import collections
def bfs_search(edges, visited):
startIndex = 1
visited[startIndex] = True
que = collections.deque([startIndex])
while que:
cur = que.popleft()
for next_index in edges[cur]:
if not visited[next_index]:
visited[next_index] = True
que.append(next_index)
if __name__ == '__main__':
n, k = map(int, input().split())
edges = collections.defaultdict(list)
for _ in range(k):
s, t= map(int, input().split())
edges[s].append(t)
visited = [False] * (n + 1)
bfs_search(edges, visited)
isAllVisited = True
for i in range(1, n + 1):
if not visited[i]:
isAllVisited = False
if isAllVisited:
print(1)
else:
print(-1)