Day51-图论

101. 孤岛总面积

101. 孤岛的总面积

深搜
python 复制代码
DIR = [[0,1],[1,0],[0,-1],[-1,0]]

def dfs(graph,x,y):
    if not graph[x][y]:
        return
    graph[x][y] = 0
    for i in range(4):
        nextx = x + DIR[i][0]
        nexty = y + DIR[i][1]
        if nextx<0 or nexty<0 or nextx>=len(graph) or nexty>=len(graph[0]):
            continue
        dfs(graph,nextx,nexty)


def main():
    n,m = map(int,input().split())
    graph = []
    for _ in range(n):
        graph.append(list(map(int,input().split())))
    # visited = [[0]*m for _ in range(n)]
    # 孤岛的定义:周围不接触边缘的岛屿
    # 一个思路是,将周围接触边缘的岛屿全部置为0,最终统计graph中1的个数
    # 遍历4条边,将其中相邻的陆地岛屿全部置为0
    # 这里不需要visited,因为我们直接修改了graph,相当于同步完成了visited工作
    for i in range(n):
        if graph[i][0]:
            dfs(graph,i,0)
        if graph[i][m-1]:
            dfs(graph,i,m-1)
    for j in range(m):
        if graph[0][j]:
            dfs(graph,0,j)
        if graph[n-1][j]:
            dfs(graph,n-1,j)
    res = sum([sum(graph[i]) for i in range(n)])
    print(res)


if __name__ == '__main__':
    main()
广搜
python 复制代码
DIR = [[0,1],[1,0],[0,-1],[-1,0]]


def bfs(graph,x,y):
    queue = []
    queue.append([x,y])
    while queue:
        x,y = queue.pop()
        graph[x][y] = 0
        for i in range(4):
            nextx = x + DIR[i][0]
            nexty = y + DIR[i][1]
            if nextx<0 or nexty<0 or nextx>=len(graph) or nexty>=len(graph[0]):
                continue 
            if graph[nextx][nexty]:
                queue.append([nextx,nexty])

def main():
    n,m = map(int,input().split())
    graph = []
    for _ in range(n):
        graph.append(list(map(int,input().split())))
    # visited = [[0]*m for _ in range(n)]
    # 孤岛的定义:周围不接触边缘的岛屿
    # 一个思路是,将周围接触边缘的岛屿全部置为0,最终统计graph中1的个数
    # 遍历4条边,将其中相邻的陆地岛屿全部置为0
    # 这里不需要visited,因为我们直接修改了graph,相当于同步完成了visited工作
    for i in range(n):
        if graph[i][0]:
            bfs(graph,i,0)
        if graph[i][m-1]:
            bfs(graph,i,m-1)
    for j in range(m):
        if graph[0][j]:
            bfs(graph,0,j)
        if graph[n-1][j]:
            bfs(graph,n-1,j)
    res = sum([sum(graph[i]) for i in range(n)])
    print(res)


if __name__ == '__main__':
    main()

102. 沉没孤岛

102. 沉没孤岛

可以构造一个visited,将周边全部记录为1,中间的孤岛的visited不查看,最后全部置为0

但是也可以直接使用graph,将非孤岛置为2,最后还原!

深搜
python 复制代码
DIR = [[0,1],[1,0],[0,-1],[-1,0]]

def dfs(graph,x,y):
    if graph[x][y] != 1:
        return
    graph[x][y] = 2
    for i in range(4):
        nextx = x + DIR[i][0]
        nexty = y + DIR[i][1]
        if nextx<0 or nexty<0 or nextx>=len(graph) or nexty>=len(graph[0]):
            continue
        dfs(graph,nextx,nexty)

def main():
    n,m = map(int,input().split())
    graph = []
    for _ in range(n):
        graph.append(list(map(int,input().split())))
    for i in range(n):
        if graph[i][0]:
            dfs(graph,i,0)
        if graph[i][m-1]:
            dfs(graph,i,m-1)
    for j in range(m):
        if graph[0][j]:
            dfs(graph,0,j)
        if graph[n-1][j]:
            dfs(graph,n-1,j)
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1:
                graph[i][j] = 0
            elif graph[i][j] == 2:
                graph[i][j] = 1
    for r in graph:
        print(' '.join(map(str,r)))


if __name__ == '__main__':
    main()
广搜
python 复制代码
DIR = [[0,1],[1,0],[0,-1],[-1,0]]

def bfs(graph,x,y):
    queue = []
    queue.append([x,y])
    while queue:
        x,y = queue.pop()
        graph[x][y] = 2
        for i in range(4):
            nextx = x + DIR[i][0]
            nexty = y + DIR[i][1]
            if nextx<0 or nexty<0 or nextx>=len(graph) or nexty>=len(graph[0]):
                continue 
            if graph[nextx][nexty]==1:
                queue.append([nextx,nexty])

def main():
    n,m = map(int,input().split())
    graph = []
    for _ in range(n):
        graph.append(list(map(int,input().split())))
    for i in range(n):
        if graph[i][0]:
            bfs(graph,i,0)
        if graph[i][m-1]:
            bfs(graph,i,m-1)
    for j in range(m):
        if graph[0][j]:
            bfs(graph,0,j)
        if graph[n-1][j]:
            bfs(graph,n-1,j)
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1:
                graph[i][j] = 0
            elif graph[i][j] == 2:
                graph[i][j] = 1
    for r in graph:
        print(' '.join(map(str,r)))


if __name__ == '__main__':
    main()

103. 高山流水

103. 高山流水

暴力思路:遍历每一个节点,对于每个节点使用深搜或者广搜,看看是否会达到边界(时间复杂度

逆向思考:我们找到第一边界和第二边界从低往高走的所有点,两个的交集就是我们要找的"高山"。(时间复杂度()由于不会重复访问同一个节点,所以实际复杂度更低

python 复制代码
DIR = [[0,1],[1,0],[0,-1],[-1,0]]

def dfs(graph,visited,x,y):
    if visited[x][y]:
        return
    visited[x][y] = 1
    for i in range(4):
        nextx = x + DIR[i][0]
        nexty = y + DIR[i][1]
        if nextx<0 or nexty<0 or nextx>=len(graph) or nexty>=len(graph[0]):
            continue
        if graph[x][y] <= graph[nextx][nexty]:
            dfs(graph,visited,nextx,nexty)

def main():
    n,m = map(int,input().split())
    graph = []
    for _ in range(n):
        graph.append(list(map(int,input().split())))
    isfirst = [[0]*m for _ in range(n)]
    issecond = [[0]*m for _ in range(n)]
    for i in range(n):
        dfs(graph,isfirst,i,0)
        dfs(graph,issecond,i,m-1)
    for j in range(m):
        dfs(graph,isfirst,0,j)
        dfs(graph,issecond,n-1,j)
    for i in range(n):
        for j in range(m):
            if isfirst[i][j] and issecond[i][j]:
                print(f"{i} {j}") 

if __name__ == '__main__':
    main()

104. 建造最大岛屿

104. 建造最大岛屿

python 复制代码
DIR = [[0,1],[1,0],[0,-1],[-1,0]]
count = 0

def dfs(graph,visited,x,y,mask):
    global count
    if visited[x][y] or graph[x][y] != 1:
        return
    visited[x][y] = 1
    graph[x][y] = mask
    count +=1
    for i in range(4):
        nextx = x + DIR[i][0]
        nexty = y + DIR[i][1]
        if nextx<0 or nexty<0 or nextx>=len(graph) or nexty>=len(graph[0]):
            continue
        dfs(graph,visited,nextx,nexty,mask) 

def main():
    global count
    n,m = map(int,input().split())
    graph = []
    for _ in range(n):
        graph.append(list(map(int,input().split())))
    visited = [[0]*m for _ in range(n)]
    d = {0:0}
    mask = 2
    res = 0
    for i in range(n):
        for j in range(m):
            if graph[i][j] and not visited[i][j]:
                # 统计岛屿面积
                count = 0
                dfs(graph,visited,i,j,mask)
                d[mask] = count
                mask +=1 
    for i in range(n):
        for j in range(m):
            if not graph[i][j]:
                tmp = set()
                for c in range(4):
                    nextx = i + DIR[c][0]
                    nexty = j + DIR[c][1]
                    if nextx<0 or nexty<0 or nextx>=len(graph) or nexty>=len(graph[0]):
                        continue
                    if graph[nextx][nexty]>1:
                        tmp.add(graph[nextx][nexty])
                res = max(res,1+sum([d[x] for x in tmp]))
    if res == 0:
        # 注意:d中包含{0:0},所以需要排除0
        res = max(d.values())
    print(res)

if __name__ == '__main__':
    main()
相关推荐
小龙报几秒前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
he___H3 分钟前
双色球红球
python
dllxhcjla4 分钟前
数据结构和算法
数据结构
deephub5 分钟前
机器学习特征工程:分类变量的数值化处理方法
python·机器学习·特征工程·分类变量
乌萨奇也要立志学C++8 分钟前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
老鼠只爱大米16 分钟前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
Pyeako23 分钟前
深度学习--卷积神经网络(下)
人工智能·python·深度学习·卷积神经网络·数据增强·保存最优模型·数据预处理dataset
OPEN-Source26 分钟前
大模型实战:搭建一张“看得懂”的大模型应用可观测看板
人工智能·python·langchain·rag·deepseek
廖圣平27 分钟前
从零开始,福袋直播间脚本研究【七】《添加分组和比特浏览器》
python
B站_计算机毕业设计之家27 分钟前
豆瓣电影数据可视化分析系统 | Python Flask框架 requests Echarts 大数据 人工智能 毕业设计源码(建议收藏)✅
大数据·python·机器学习·数据挖掘·flask·毕业设计·echarts