AcWing 852. SPFA 判断是否有负环 PYTHON
原题链接
简单
作者:
Gyp
,
2020-03-14 21:35:10
,
所有人可见
,
阅读 1027
dist 初始化 为任何数 好像都不影响最终答案
import collections
n, m = map(int, input().split())
g = collections.defaultdict(list)
st = [True for i in range(n+1)]
dist = [0 for i in range(n+1)]
cnt = [0 for i in range(n+1)]
for i in range(m):
a, b, w = map(int, input().split())
g[a].append([b, w])
def spfa():
q = [i for i in range(n+1)]
while len(q) != 0:
a = q.pop() ## 这里要注意 如果用pop(0) 会超时,这是因为 Python中 pop(0)复杂度O(n),pop()是O(1)
st[a] = False
for b, w in g[a]:
if dist[b] > dist[a] + w:
cnt[b] = cnt[a] + 1
if cnt[b] >= n:
return True
dist[b] = dist[a] + w
if st[b] == False:
q.append(b)
return False
print("Yes" if spfa() else "No")
感谢老铁的提醒,python题友抱团取暖QAQ
非常棒!!!不用因为pop(0)超时了
为啥初始化‘inf’不行呢
因为永远不会更新,对“inf”的四则运算之后都是inf
为什么spfa求最短路可以初始化为inf:因为开始的时候只会把起点加入到队列中
你初始化为-INF试试