1753最短パス
1929 ワード
白準1753最短経路問題-1
始点Kから1からVまでの数字の場合に必要な最小重み付けと(最短経路)の求め方の問題です.
最初はBFSで解いてみました.
でも…。
タイムアウトではなく、メモリタイムアウトです.def BFS(n): #도착점 n에 대한 BFS함수
if k == n:
return 0
q = list()
used = [0]*(v+1)
for i in range(e):
if arr[i][0] == k :
q.append(arr[i])
while q:
s = q.pop(0)
used[s[1]] = 0
if s[1] == n:
if not used[s[1]]:
used[s[1]] = used[s[0]]+s[2]
return used[s[1]]
else :
return used[s[1]]
for i in range(1, v+1):
if adj[s[1]][i] == 1 and not used[i]:
for j in range(e):
if [s[1],i,j] in arr:
q.append([s[1],i,j])
break
used[s[1]] = used[s[0]]+s[2]
else :
return 'INF'
v, e = map(int,input().split())
k = int(input())
arr = [list(map(int,input().split())) for _ in range(e)]
# cnt = 1
# newarr = list()
adj = [[0]*(v+1) for _ in range(v+1)]
for i in range(e):
for j in range(e-1):
if arr[j][2] > arr[j+1][2]:
arr[j][2], arr[j+1][2] = arr[j+1][2], arr[j][2]
for i in range(e):
adj[arr[i][0]][arr[i][1]] = 1
for i in range(1,v+1):
print(BFS(i))
重み付けを必要とせずに並べ替え,幹線の数や最大頂点の数に応じて記憶経路のadj配列が大量のメモリを消費すると推定できる.
教授によると、頂点数が1000個を超えると、ほとんどが問題の最大メモリを超えるという.
ただし、メモリオーバーが発生しただけで、メモリオーバーでなければタイムアウトが発生するに違いありません.
やはり
adj配列を使用せずにarr配列に確認してインポートした場合、頂点が2万個の場合、2万回のゲートのキューを回転するたびにbfs関数が呼び出されるたびに返されます.
いずれにしても基本的なBFSは難しいようです.
もしそうなら、木を描いて探索したり、最小のお尻を探す方法で探したりしたほうがいいです.
Reference
この問題について(1753最短パス), 我々は、より多くの情報をここで見つけました
https://velog.io/@do0134/1753-최단경로
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
def BFS(n): #도착점 n에 대한 BFS함수
if k == n:
return 0
q = list()
used = [0]*(v+1)
for i in range(e):
if arr[i][0] == k :
q.append(arr[i])
while q:
s = q.pop(0)
used[s[1]] = 0
if s[1] == n:
if not used[s[1]]:
used[s[1]] = used[s[0]]+s[2]
return used[s[1]]
else :
return used[s[1]]
for i in range(1, v+1):
if adj[s[1]][i] == 1 and not used[i]:
for j in range(e):
if [s[1],i,j] in arr:
q.append([s[1],i,j])
break
used[s[1]] = used[s[0]]+s[2]
else :
return 'INF'
v, e = map(int,input().split())
k = int(input())
arr = [list(map(int,input().split())) for _ in range(e)]
# cnt = 1
# newarr = list()
adj = [[0]*(v+1) for _ in range(v+1)]
for i in range(e):
for j in range(e-1):
if arr[j][2] > arr[j+1][2]:
arr[j][2], arr[j+1][2] = arr[j+1][2], arr[j][2]
for i in range(e):
adj[arr[i][0]][arr[i][1]] = 1
for i in range(1,v+1):
print(BFS(i))
Reference
この問題について(1753最短パス), 我々は、より多くの情報をここで見つけました https://velog.io/@do0134/1753-최단경로テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol