首页 > 其他分享 >第十一章 图论 Part4

第十一章 图论 Part4

时间:2024-09-07 12:25:52浏览次数:8  
标签:图论 遍历 第十一章 len range grid endWord Part4 节点

目录

任务

127. 单词接龙

字典 wordList 中从单词 beginWord 到 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk:

  • 每一对相邻的单词只差一个字母。
  • 对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
  • sk == endWord

给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0

思路

由于是求最短路径,实际转化为通过bfs第一次遍历到endWord的情况。bfs的逻辑与二叉树层序遍历的逻辑相似,可以参考二叉树层序遍历的逻辑。
题目中的单词数目或者说路径长度可以理解为遍历的层数(bfs),只不过初始为1

class Solution:
    def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
        if endWord not in wordList:
            return 0
        wordSet = set(wordList)
        que = deque()
        que.append(beginWord)
        pathLength = 1
        while que: # 处理所有节点
            for _ in range(len(que)): # 处理每层全部节点
                curWord = que.popleft()
                
                for i in range(len(curWord)):
                    newWord  = curWord
                    for j in range(26):
                        character=  chr(ord('a') + j)
                        newWord = newWord[:i] + character + newWord[i+1:]
                        
                        if newWord == endWord:
                            return pathLength+1

                        if newWord in wordSet:
                            wordSet.remove(newWord)
                            que.append(newWord)
            pathLength += 1
        return 0

Kama105.有向图的完全可达性

给定一个有向图,包含 N 个节点,节点编号分别为 1,2,...,N。现从 1 号节点开始,如果可以从 1 号节点的边可以到达任何节点,则输出 1,否则输出 -1。

思路

由于是有向图,实际上就是dfs的应用,需要注意的是有很多种写法如

  • 终止条件写外面,处理当前节点. (这种写法一般在求两点间所有路径的编码中出现,终止条件是当前点等于终点时,统计一条路径并返回,而在循环中有回溯的逻辑)
  • 终止条件隐藏在遍历的过程中,处理下一个访问的节点 (个人很少用这种写法)
  • 终止条件隐藏在遍历过程中,处理当前节点(当前写法),类比之前输入为grid时的写法,只不过输入改成了邻接表

只要熟练掌握其中一种写法,其他写法可以理解即可。

def dfs(graph, key, visited):
    visited[key] = true; # 能到达的点标记为true
    for neibokey in graph[key]:
        if (visited[neibokey] == false): # 递归遍历没访问过的节点
            dfs(graph, neibokey, visited)    
    
def canArrive(graph):
    visited = [[false] *len(graph[0]) for _ in range(graph)]
    dfs(graph,1,visited) # dfs遍历并标记走过的节点
    for i in range(len(visited)):
        if not visited[i]:
            return False
    return True

463. 岛屿的周长

给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

思路

容易用惯性思维只要看到岛屿就要去遍历,实际上这道题求的是周长,不需要遍历,直观的,只要求岛屿的交接处是水域或者是边界的个数即可。

class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        
        dir = [(1,0),(0,1),(-1,0),(0,-1)] #逆时针四个方向
        res = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if(grid[i][j] == 1):
                    for k in range(4):
                        x = i + dir[k][0]
                        y = j + dir[k][1]
                        if x < 0 or y<0 or x>=len(grid) or y>=len(grid[0]) or grid[x][y] == 0:#坐标在边界上: 或者坐标位置是水
                            res += 1
        return res

标签:图论,遍历,第十一章,len,range,grid,endWord,Part4,节点
From: https://www.cnblogs.com/haohaoscnblogs/p/18401543

相关文章

  • 图论板子
    Primtypedefpair<int,int>P;intprim(){intans=0,cnt=0;priority_queue<P,vector<P>,greater<P>>q;fill(d+1,d+n+1,INF);d[1]=0;q.push(P(d[1],1));while(!q.empty()&&cnt<......
  • 代码随想录day 53 || 图论4
    字符串接龙varqueue*list.ListvarvisitMapmap[string]boolfuncmain(){ varcountint fmt.Scanf("%d",&count) varstartStr,endStrstring fmt.Scanf("%s%s",&startStr,&endStr) varstrList=make([]string,count) fo......
  • 行政组织理论-第十一章:创建学习型组织
    章节章节汇总第一章:绪论第二章:行政组织的演变第三章:科层制行政组织理论第四章:人本主义组织理论第五章:网络型组织理论第六章:行政组织目标第七章:行政组织结构第八章:行政组织体制第九章:行政组织设置与自身管理第十章:组织激励第十一章:创建学习型组织第十二章:政府再造流程第十三......
  • 第十二章 图论 Part3
    目录任务Kama101.孤岛的总面积思路Kama102.沉没孤岛思路Kama103.水流问题思路Kama104.建造最大岛屿思路心得任务Kama101.孤岛的总面积给定一个由1(陆地)和0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩......
  • 代码随想录day52 || 图论3
    岛屿最大的孤岛面积packagemainimport"fmt"vardirPath=[4][2]int{{0,-1},{1,0},{0,1},{-1,0}}varvisited[][]boolvarflagboolvarresintfuncmain(){ varx,yint fmt.Scanf("%d%d",&x,&y) //x行y列初始化临界矩阵 vargra......
  • 第十一章 图论 Part2
    目录任务200.岛屿数量思路695.岛屿的最大面积思路任务200.岛屿数量给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。思......
  • 代码随想录day52 || 图论搜索 岛屿数量,岛屿的最大面积
    图遍历dfs深度优先搜索bfs广度优先搜索200岛屿数量(dfs)vardirPath=[][]int{{0,-1},{1,0},{0,1},{-1,0}}//上,右,下,左varvisited[][]boolfuncnumIslands(grid[][]byte)int{ //dfs深度优先遍历,对于每一个节点,按照上下左右四个固定顺序遍历,然后到下......
  • 搜索与图论
    这部分内容要用到树的数据结构,我们有以下几种方式来存储节点邻接表邻接表就是用类似链表的结构来存储数据,先创建一个数组h,每一个位置都有一个表头。然后e数组和ne数组分别表示节点的值是多少,节点的下一个节点的编号是多少,这种方式一般用在稠密图中,也就是节点数跟边数相差很大。......
  • 图论连通性相关
    并查集普通并查集:路径压缩写法:structUnion_Find_Set{ intf[N]; inlinevoidinit(){ for(inti=1;i<=n;++i) f[i]=i; } inlineintfind(intx){ if(x!=f[x])f[x]=find(f[x]); returnf[x]; } inlinevoidmerge(inta,intb){ intx......
  • 代码随想录训练营 Day50打卡 图论part01 理论基础 98. 所有可达路径
    代码随想录训练营Day50打卡图论part01一、理论基础DFS(深度优先搜索)和BFS(广度优先搜索)在图搜索中的核心区别主要体现在搜索策略上:1、搜索方向:DFS:深度优先,一条路走到黑。DFS从起点开始,选择一个方向深入到底,遇到死胡同再回溯,换一个方向继续探索。这种方式适合解决路径......