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)
并查集
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。