leetcode-图相关的题目

python中图的表示方法

https://blog.csdn.net/zhang_xiaomeng/article/details/72865089

嵌套列表 嵌套字典

图的边缘表示

https://zhuanlan.zhihu.com/p/110022390

拓扑排序详解

https://www.cnblogs.com/bigsai/p/11489260.html

1.课程表

https://leetcode-cn.com/problems/course-schedule/

题解

https://blog.csdn.net/IOT_victor/article/details/88936395

图的广度优先搜索

图的深度优先搜索

https://blog.csdn.net/weizhifei1234/article/details/88787352

"""想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]"""
"""list[1]是list[0]的先修课程,list[1]指向list[0]"""
"""广度优先:从入度为0的节点开始遍历,学完一门课,将入度减去1,直到所有课程学完。"""
"""深度优先:从出度为0的节点(已经修完的课程)开始遍历"""
class Solution(object):
    def canFinish(self, numCourses, prerequisites):
        """
        :type numCourses: int
        :type prerequisites: List[List[int]]
        :rtype: bool
        """
        #广度优先遍历
        import collections
        #把边缘列表形式的输入数据转化为字典列表有向图形式,
        #key为当前节点,value为当前节点的出度(指向)
        edges = collections.defaultdict(list)
        #存储入度为0的节点,被指向的节点的出现次数(list[0])
        indeg = [0] * numCourses
        #构图
        for info in prerequisites:
            edges[info[1]].append(info[0])
            indeg[info[0]] += 1
        #找到入度为0的节点的index,设置为队列
        q = collections.deque([u for u in range(numCourses) if indeg[u] == 0])
        visited = 0
        while q:
            visited += 1
            #弹出入度为0的节点
            u = q.popleft()
            #找到入度为0的节点的下一个节点
            for v in edges[u]:
                #假设拿掉入度为0的节点,他的下一个节点的入度减去1
                indeg[v] -= 1
                #如果入度为0,加入队列
                if indeg[v] == 0:
                    q.append(v)
        #如果遍历次数等于课程数,说明没有环
        return visited == numCourses
        

numCourses=3
prerequisites=[[1,0,1],[1,0,2]]
res=Solution().canFinish(numCourses,prerequisites)

并查集

https://wulc.me/2017/10/12/LeetCode%20%E8%A7%A3%E9%A2%98%E6%8A%A5%E5%91%8A(684,685,721)-%E5%B9%B6%E6%9F%A5%E9%9B%86%E4%BB%8B%E7%BB%8D%E5%8F%8A%E5%BA%94%E7%94%A8/

127. 单词接龙 bfs

https://blog.csdn.net/qq_17550379/article/details/83652490

class Solution:
    def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
        wordDict = collections.defaultdict(list)
        for word in wordList:
            for i in range(len(word)):
                tmp = word[:i] + "_" + word[i+1:]
                wordDict[tmp].append(word)
        
        q, visited = [(beginWord, 1)], set()
        while q:
            word, step = q.pop(0)
            if word not in visited:
                visited.add(word)
                if word == endWord:
                    return step
                for i in range(len(word)):
                    tmp = word[:i] + "_" + word[i+1:]
                    for neigh in wordDict[tmp]:
                        q.append((neigh, step + 1))
        return 0 
def build_model_v3(beginWord, endWord, wordList):
    #
    import collections
    worddict = collections.defaultdict(list)
    for word in wordList:
        for i in range(len(word)):
            tmp = word[:i] + "_" + word[i+1:]
            worddict[tmp].append(word)
    print(worddict)
    queen=[]
    queen.append(beginWord)
    visited=[]
    level=0
    while len(queen)!=0:
        size=len(queen)
        level=level+1
        print(level)
        while size>0:
            cur_word=queen.pop(0)
            print(cur_word)
            for i in range(len(cur_word)):
                tmp=cur_word[:i] + "_" + cur_word[i+1:]
                word_neigh=worddict[tmp]
                #判断是否遍历过
                for j in word_neigh:
                    if j==endWord:
                        return level+1
                    if j not in visited:
                        queen.append(j)
                        visited.append(j)
            size=size-1
    return 0
    
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log","cog"]
res=build_model_v3(beginWord, endWord, wordList)
print(res)

126 单词接龙2

bfs记录路径

https://leetcode-cn.com/problems/word-ladder-ii/solution/python-bfs-by-dangerusswilson-7/

class Solution:
    def findLadders(self, beginWord, endWord, wordList):  
        wordList = set(wordList)
        dic = collections.defaultdict(list)
        n = len(beginWord)
        for w in wordList:
            for i in range(n):
                dic[w[:i] + '*' + w[i+1:]].append(w)
        q, s = collections.deque([(beginWord, [beginWord])]), collections.deque()
        seen, res = set(), []
        while q:
            while q:
                w, path = q.popleft()
                if w == endWord: res.append(path)
                seen.add(w)
                for i in range(n):
                    for v in dic[w[:i] + '*' + w[i+1:]]:
                        if v not in seen:
                            s.append((v, path + [v]))
            if res: return res
            q, s = s, q
        return []

作者:dangerusswilson
链接:https://leetcode-cn.com/problems/word-ladder-ii/solution/python-bfs-by-dangerusswilson-7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值