Pythonの最初から最後のノードまでの制限されたパスの数を見つけるプログラム
無向加重連結グラフが1つあるとします。グラフにはn個のノードがあり、1からnまでのラベルが付けられています。開始から終了までのパスは、[z0、z1、z2、...、zk]のようなノードのシーケンスです。ここで、z0は開始ノード、zkは終了ノードであり、ziとzi+1の間にエッジがあります。ここで0<=i<=k-1。パスの距離は、パスのエッジの重み値の合計です。 dist(x)がノードnとノードxからの最短距離を表すとします。制限付きパスは、dist(zi)> dist(zi + 1)(0 <=i <=k-1)も満たす特別なパスです。したがって、ノード1からノードnまでの制限されたパスの数を見つける必要があります。答えが大きすぎる場合は、10 ^ 9+7を法として答えを返します。
したがって、入力が次のような場合
3つの制限されたパス(1,2,5)、(1,2,3,5)、(1,3,5)があるため、出力は3になります。
これを解決するには、次の手順に従います-
-
グラフ:=指定されたエッジリストから作成されたグラフの隣接リスト
-
パス:=サイズ(n + 1)の配列で、0で埋められます
-
パス[n]:=1
-
dists:=サイズ(n + 1)の配列で、-1で埋められます
-
q:=キュー、最初に(0、n)を挿入
-
qが空でない間、実行します
-
(dist、node):=qのフロント要素であり、qから削除します
-
dists [node]が-1と同じでない場合、
-
次のイテレーションに行く
-
-
dists [node]:=dist
-
隣接するノードvとgraph[node]の重みwごとに、実行
-
dists [v]が-1と同じ場合、
-
(dist + w、v)をqに挿入します
-
-
それ以外の場合、dists [v]
-
パス[ノード]:=パス[ノード]+パス[v]
-
-
-
ノードが1と同じ場合、
-
リターンパス[ノード]mod10 ^ 9 + 7
-
-
-
0を返す
例
理解を深めるために、次の実装を見てみましょう-
from collections import defaultdict from heapq import heappop, heappush def solve(n, edges): graph = defaultdict(dict) for u, v, w in edges: graph[u][v] = w graph[v][u] = w paths = [0] * (n+1) paths[n] = 1 dists = [-1] * (n+1) q = [(0, n)] while q: dist, node = heappop(q) if dists[node] != -1: continue dists[node] = dist for v, w in graph[node].items(): if dists[v] == -1: heappush(q, (dist + w, v)) elif dists[v] < dists[node]: paths[node] += paths[v] if node == 1: return paths[node] % (10**9 + 7) return 0 n = 5 edges = [(1,2,3),(1,3,3),(2,3,1),(1,4,2),(5,2,2),(3,5,1),(5,4,10)] print(solve(n, edges))
入力
5,[(1,2,3),(1,3,3),(2,3,1),(1,4,2),(5,2,2),(3,5,1),(5,4,10)]
出力
3
-
リスト内で最大数を見つけるPythonプログラム
この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 与えられたリスト入力では、与えられたリストの中で最大の数を見つける必要があります。 ここでは、2つのアプローチについて説明します 並べ替え手法の使用 組み込みのmax()関数を使用する アプローチ1-組み込みのsort()関数を使用する 例 list1 = [18, 65, 78, 89, 90] list1.sort() # main print("Largest element is:", list1[-1]) 出力 Largest element is:
-
文字のストリームから最初の繰り返しのない文字を見つけるPythonプログラム?
このセクションでは、文字列または文字のストリームから最初の一意の文字または繰り返されない文字を見つけます。この問題を解決する方法は複数あります。同じキャラクターのストリームに対して2つの異なるプログラムを作成しようとします。 方法1:関数を使用する def firstNonRepeatingChar(str1): char_order = [] counts = {} for c in str1: if c in counts: &n