571 字
3 分钟
代码随想录算法训练营第四十六天 | 图论 Part04
卡码网:110. 字符串接龙
思路:
- 将所有中间词放入集合
word_set
,若endStr
不在其中且不等于beginStr
,则加入集合。 - 用 BFS(队列
queue
)从beginStr
开始,每一步扩展所有与当前字符串仅差一个字符的词,并将其从集合中移除以避免重复访问。 - 当遇到
endStr
时输出当前变换长度,否则结束后输出 0。
import sysfrom collections import deque
def main(): data = sys.stdin.read().split() N = int(data[0]) beginStr, endStr = data[1], data[2] strList = data[3:3+N]
word_set = set(strList) if endStr != beginStr and endStr not in word_set: word_set.add(endStr) # 加入终点,方便BFS找到
queue = deque() queue.append((beginStr, 1))
def is_one_char_diff(s1, s2): if len(s1) != len(s2): return False return sum(c1 != c2 for c1, c2 in zip(s1, s2)) == 1
while queue: current, length = queue.popleft() if current == endStr: print(length) return
to_remove = [] for word in word_set: if is_one_char_diff(current, word): queue.append((word, length + 1)) to_remove.append(word) for w in to_remove: word_set.remove(w)
print(0)
if __name__ == "__main__": main()
卡码网:105. 有向图的完全联通
思路:
- 构建邻接表
graph
,从节点 1 开始 BFS,使用visited
数组标记已访问节点。 - 遍历完所有可达节点后,若访问计数等于
N
,则输出 1,否则输出 -1。
import sysfrom collections import deque
def main(): data = sys.stdin.read().strip().split() N, K = int(data[0]), int(data[1]) edges = data[2:]
graph = [[] for _ in range(N+1)] for i in range(0, 2*K, 2): s, t = int(edges[i]), int(edges[i+1]) graph[s].append(t)
visited = [False] * (N+1) queue = deque([1]) visited[1] = True count = 1
while queue: node = queue.popleft() for nxt in graph[node]: if not visited[nxt]: visited[nxt] = True count += 1 queue.append(nxt)
print(1 if count == N else -1)
if __name__ == "__main__": main()
卡码网:106. 岛屿周长
思路:
- 遍历整个网格,对每个值为 1 的格子,检查其上、下、左、右四个方向:
- 若相邻格子为水(0)或越界,则该边贡献周长 1。
- 累加所有陆地格子的周长,最后输出总和。
import sysinput = sys.stdin.read
def main(): data = input().split() n, m = int(data[0]), int(data[1]) index = 2 grid = [[0] * m for _ in range(n)] for i in range(n): for j in range(m): grid[i][j] = int(data[index]) index += 1
res = 0 for i in range(n): for j in range(m): if grid[i][j] == 1: # 上 if i == 0 or grid[i - 1][j] == 0: res += 1 # 下 if i == n - 1 or grid[i + 1][j] == 0: res += 1 # 左 if j == 0 or grid[i][j - 1] == 0: res += 1 # 右 if j == m - 1 or grid[i][j + 1] == 0: res += 1 print(res)
if __name__ == "__main__": main()
代码随想录算法训练营第四十六天 | 图论 Part04
https://fuwari.vercel.app/posts/code_musings_day_forty-six/