571 字
3 分钟
代码随想录算法训练营第四十六天 | 图论 Part04

卡码网:110. 字符串接龙#

题目链接

思路:

  • 将所有中间词放入集合 word_set,若 endStr 不在其中且不等于 beginStr,则加入集合。
  • 用 BFS(队列 queue)从 beginStr 开始,每一步扩展所有与当前字符串仅差一个字符的词,并将其从集合中移除以避免重复访问。
  • 当遇到 endStr 时输出当前变换长度,否则结束后输出 0。
import sys
from 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 sys
from 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 sys
input = 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/
作者
Jarrett
发布于
2025-08-02
许可协议
CC BY-NC-SA 4.0