day51-graph theory-part02-8.22

tasks for today:

1. 99.岛屿数量(DFS)

2. 99.岛屿数量(BFS)

3. 100.岛屿最大面积

--------------------------------------------------------------------

1. 99.岛屿数量(DFS)

direction = [[0, 1], [0, -1], [1, 0], [-1, 0]]

def dfs(graph, visited, x, y):
    for dirx, diry in direction:
        searchx = x + dirx
        searchy = y + diry
        if searchx < 0 or searchx >= len(graph) or searchy < 0 or searchy >= len(graph[0]):
            continue
        if graph[searchx][searchy] == 1 and not visited[searchx][searchy]:
            visited[searchx][searchy] = True
            dfs(graph, visited, searchx, searchy)

def main():
    n, m = map(int, input().split())
    graph = []
    
    for i in range(n):
        graph.append(list(map(int, input().split())))
    
    visited = [[False] * m for _ in range(n)]
    
    result = 0
    
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1 and not visited[i][j]:
                result += 1
                visited[i][j] = True
                dfs(graph, visited, i, j)
    
    print(result)
    
if __name__ == "__main__":
    main()

2. 99.岛屿数量(BFS)

pay attention: as long as the point is added into the queue, that means the point has been visited, do not wait until the point is poped out.

from collections import deque

direction = [[0, 1], [0, -1], [1, 0], [-1, 0]]

def bfs(graph, visited, x, y):
    bfsQueue = deque()
    bfsQueue.append([x,y])
    visited[x][y] = True
    while bfsQueue:
        curNode = bfsQueue.popleft()
        for dirx, diry in direction:
            searchx = curNode[0] + dirx
            searchy = curNode[1] + diry
            if searchx < 0 or searchx >= len(graph) or searchy < 0 or searchy >= len(graph[0]):
                continue
            if graph[searchx][searchy] == 1 and not visited[searchx][searchy]:
                bfsQueue.append([searchx, searchy])
                visited[searchx][searchy] = True

def main():
    n, m = map(int, input().split())
    graph = []
    
    for i in range(n):
        graph.append(list(map(int, input().split())))
    
    visited = [[False] * m for _ in range(n)]
    
    result = 0
    
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1 and not visited[i][j]:
                result += 1
                # visited[i][j] = True
                bfs(graph, visited, i, j)
    
    print(result)
    
if __name__ == "__main__":
    main()

3. 100.岛屿最大面积

DFS

direction = [[1,0],[-1,0],[0,1],[0,-1]]

def dfs(graph, visited, x, y, area):
    for dirx, diry in direction:
        searchx = x + dirx
        searchy = y + diry
        if searchx < 0 or searchx >= len(graph) or searchy < 0 or searchy >= len(graph[0]):
            continue
        if graph[searchx][searchy] == 1 and not visited[searchx][searchy]:
            visited[searchx][searchy] = True
            area += 1
            area = dfs(graph, visited, searchx, searchy, area)
    return area
            
def main():
    n, m = map(int, input().split())
    graph = []
    
    for i in range(n):
        graph.append(list(map(int, input().split())))
        
    visited = [[False] * m for _ in range(n)]
    
    result = 0
    
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1 and not visited[i][j]:
                area = 1
                visited[i][j] = True
                area = dfs(graph, visited, i, j, area)
                result = max(area, result)
    
    
    print(result)
    

if __name__ == "__main__":
    main()

BFS

from collections import deque

direction = [[1,0],[-1,0],[0,1],[0,-1]]

def bfs(graph, visited, x, y, area):
    bfsQueue = deque()
    bfsQueue.append([x,y])
    visited[x][y] = True
    while bfsQueue:
        curNode = bfsQueue.popleft()
        for dirx, diry in direction:
            searchx = curNode[0] + dirx
            searchy = curNode[1] + diry
            if searchx < 0 or searchx >= len(graph) or searchy < 0 or searchy >= len(graph[0]):
                continue
            if graph[searchx][searchy] == 1 and not visited[searchx][searchy]:
                bfsQueue.append([searchx,searchy])
                visited[searchx][searchy] = True
                area += 1
    return area
            
def main():
    n, m = map(int, input().split())
    graph = []
    
    for i in range(n):
        graph.append(list(map(int, input().split())))
        
    visited = [[False] * m for _ in range(n)]
    
    result = 0
    
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1 and not visited[i][j]:
                area = 1
                # visited[i][j] = True
                area = bfs(graph, visited, i, j, area)
                result = max(area, result)
    
    
    print(result)
    

if __name__ == "__main__":
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值