20240821 代码随想录 | 图论

103. 水流问题

dfs深度优先搜素

directions = [[0,1], [0,-1], [1,0], [-1,0]]
set_1 = set()
set_2 = set()
n, m = map(int, input().split())
g = []
for _ in range(n):
    g.append(list(map(int, input().split())))

def dfs(g, x, y, visited, s):
    visited[x][y] = True
    # 注意这里因为s是集合
    # 在Python中,集合(set)可以包含任何不可变类型(如整数、浮点数、字符串、元组等)作为元素。然而,由于列表(list)是可变类型,它不能作为集合的元素。
    s.add((x,y))
    for d in directions:
        next_x = x + d[0]
        next_y = y + d[1]
        if next_x>=0 and next_x=0 and next_y=g[x][y]:
            dfs(g, next_x, next_y, visited, s)
    
visited = [[False]*m for _ in range(n)]
for i in range(n):
    if not visited[i][0]:
        dfs(g, i, 0, visited, set_1)
for j in range(m):
    if not visited[0][j]:
        dfs(g, 0, j, visited, set_1)

# 注意:这里考虑第二组边界的时候visited需要重置,否则一些能到达的点无法标记到set_2
visited = [[False]*m for _ in range(n)]
for i in range(n):
    if not visited[i][m-1]:
        dfs(g, i, m-1, visited, set_2)
for j in range(m):
    if not visited[n-1][j]:
        dfs(g, n-1, j, visited, set_2)

result = set_1 & set_2

for i in result:
    print(" ".join(map(str, i)))

bfs广度优先搜索

from collections import deque
directions = [[0,1], [0,-1], [1,0], [-1,0]]
set_1 = set()
set_2 = set()
n, m = map(int, input().split())
g = []
for _ in range(n):
    g.append(list(map(int, input().split())))

def bfs(g, x, y, visited, s):
    que = deque()
    visited[x][y] = True
    # 注意这里因为s是集合
    # 在Python中,集合(set)可以包含任何不可变类型(如整数、浮点数、字符串、元组等)作为元素。然而,由于列表(list)是可变类型,它不能作为集合的元素。
    s.add((x,y))
    que.append([x,y])
    while que:
        x, y = que.popleft()
        for d in directions:
            next_x = x + d[0]
            next_y = y + d[1]
            if next_x>=0 and next_x=0 and next_y=g[x][y]:
                visited[next_x][next_y] = True
                s.add((next_x, next_y))
                que.append([next_x, next_y])
    
visited = [[False]*m for _ in range(n)]
for i in range(n):
    if not visited[i][0]:
        bfs(g, i, 0, visited, set_1)
for j in range(m):
    if not visited[0][j]:
        bfs(g, 0, j, visited, set_1)

# 注意:这里考虑第二组边界的时候visited需要重置,否则一些能到达的点无法标记到set_2
visited = [[False]*m for _ in range(n)]
for i in range(n):
    if not visited[i][m-1]:
        bfs(g, i, m-1, visited, set_2)
for j in range(m):
    if not visited[n-1][j]:
        bfs(g, n-1, j, visited, set_2)

result = set_1 & set_2

for i in result:
    print(" ".join(map(str, i)))

104.建造最大岛屿

dfs深度优先搜索:

directions = [[0,1], [0,-1], [1,0], [-1,0]]
n, m = map(int, input().split())
g = []
map_dict = {}
num = 1
for _ in range(n):
    g.append(list(map(int, input().split())))

def dfs(g, x, y, num):
    g[x][y] = num
    map_dict[num] += 1
    for d in directions:
        next_x = x + d[0]
        next_y = y + d[1]
        if next_x>=0 and next_x=0 and next_y=0 and next_x=0 and next_y 0:
                        cur += map_dict[g[next_x][next_y]]
                        # 注意一个海水被同一片陆地在不同方向包围的情况
                        visited.append(g[next_x][next_y])
                result = max(result, cur)
    
    print(result)              

bfs广度优先搜索:

from collections import deque
directions = [[0,1], [0,-1], [1,0], [-1,0]]
n, m = map(int, input().split())
g = []
map_dict = {}
num = 1
for _ in range(n):
    g.append(list(map(int, input().split())))

def bfs(g, x, y, num):
    que = deque()
    g[x][y] = num
    map_dict[num] += 1
    que.append([x,y])
    while que:
        x, y = que.popleft()
        for d in directions:
            next_x = x + d[0]
            next_y = y + d[1]
            if next_x>=0 and next_x=0 and next_y=0 and next_x=0 and next_y 0:
                        cur += map_dict[g[next_x][next_y]]
                        # 注意一个海水被同一片陆地在不同方向包围的情况
                        visited.append(g[next_x][next_y])
                result = max(result, cur)
    
    print(result)              

 110. 字符串接龙

 

from collections import deque
n = int(input())
beginStr, endStr = map(str, input().split())
strList = set()
for _ in range(n):
    strList.add(input())

def find():
    q = deque()
    q.append(beginStr)
    visited = {beginStr: 1}
    
    while q:
        cur_s = q.popleft()
        cur_step = visited[cur_s]
        for i in range(len(cur_s)):
            for j in range(26):
                new_s = cur_s[:i] + chr(ord('a') + j) + cur_s[i+1:]
                if new_s == endStr:
                    return cur_step+1
                if new_s in strList and new_s not in visited:
                    visited[new_s] = cur_step + 1
                    q.append(new_s)

    return 0
    
print(find())

105.有向图的完全可达性

n,k = map(int, input().split())
table = [[] for _ in range(n+1)]
for _ in range(k):
    i,j = map(int, input().split())
    table[i].append(j)
    
accessible = []

def dfs(table, key, accessible):
    accessible.append(key)
    if not table[key]:
        return
    keys = table[key]
    for key in keys:
        if key not in accessible:
            dfs(table, key, accessible)

dfs(table, 1, accessible)
result = 1   
for i in range(1, n+1):
    if i not in accessible:
        result = -1
        break
    
print(result)

 106. 岛屿的周长

n,m = map(int, input().split())
g = []
for _ in range(n):
    g.append(list(map(int, input().split())))

directions = [[0,1], [0,-1], [1,0], [-1,0]]  
result = 0
for i in range(n):
    for j in range(m):
        if g[i][j] == 1:
            for d in directions:
                x = i + d[0]
                y = j + d[1]
                if x < 0  or x >= n or y < 0 or y >= m or g[x][y] == 0:
                    result += 1
print(result)

你可能感兴趣的:(图论)