Python
 Computer >> コンピューター >  >> プログラミング >> Python

グラフに共通の到達可能なノードがあるかどうかをPythonでチェックするプログラム


有向グラフのエッジリストがあり、ノードがn個あり、ノード名が0〜n-1であるとします。2つの整数値aとbもあります。 cからaに、またcからbに移動できるようなノードcがあるかどうかを確認する必要があります。

したがって、入力が次のような場合

グラフに共通の到達可能なノードがあるかどうかをPythonでチェックするプログラム

また、a =2、b =3の場合、出力はTrueになります。これは、ここではc =0であるため、0から2、さらには0から3へのルートがあります。

これを解決するには、次の手順に従います-

  • 関数DFS()を定義します。これは、グラフ、ノード、訪問済みを取得します
  • ノードにアクセスしていない場合は、
    • ノードを訪問済みとしてマーク
    • グラフ[ノード]のxごとに、
        を実行します。
      • DFS(グラフ、x、訪問済み)
  • メインの方法から、次の手順を実行します-
  • グラフ:=edge_listから隣接リストを生成する
  • visited_a、visited_b:=2つの空のセット
  • DFS(graph、a、visited_a)
  • DFS(graph、b、visited_b)
  • ans:=visited_bとvisited_aの交差点からの新しいリスト
  • ansが空でない場合は、
    • Trueを返す
  • Falseを返す

理解を深めるために、次の実装を見てみましょう-

def edge_list_to_graph(edges):
   s = set()
   for x, y in edges:
      s.add(x)
      s.add(y)
   s = len(list(s))
   graph = [[] for x in range(s)]
   for x, y in edges:
      graph[y].append(x)
   return graph

def DFS(graph, node, visited):
   if node not in visited:
      visited.add(node)
      for x in graph[node]:
         DFS(graph, x, visited)

def solve(edges, a, b):
   graph = edge_list_to_graph(edges)

   visited_a, visited_b = set(), set()

   DFS(graph, a, visited_a)
   DFS(graph, b, visited_b)

   ans = list(visited_a.intersection(visited_b))
   if ans:
      return True
   return False

ed_list = [(0, 4),(4, 3),(1, 2),(0, 1),(0, 2),(1, 1)]
a = 2
b = 3
print(solve(ed_list, a, b))

入力

[(0, 4),(4, 3),(1, 2),(0, 1),(0, 2),(1, 1)], 2, 3

出力

True

  1. 与えられたグラフがPythonで2部グラフであるかどうかをチェックするプログラム

    無向グラフが1つあるとすると、グラフが2部グラフであるかどうかを確認する必要があります。グラフのすべてのエッジ{u、v}がAに1つのノードuを持ち、Bに別のノードvを持つように、グラフのノードを2つのセットAとBに分割できる場合、グラフは2部グラフであることがわかります。 したがって、入力が次のような場合 次に、出力はTrueになり、[0,4]はセットAにあり、[1,2,3]はセットBにあり、すべてのエッジはAからAまたはBからBではなく、AからBまたはBからAになります。 。 これを解決するために、次の手順に従います- 関数dfs()を定義します。これはソースを取ります

  2. 指定された文字列がキーワードであるかどうかを確認するPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −数値が与えられているので、その数値が2の累乗であるかどうかを確認する必要があります。 キーワードは、特定の用途で任意の言語によって予約されている特別な単語であり、識別子として使用することはできません。 指定された文字列がキーワードであるかどうかを確認するために、以下で説明するようにキーワードモジュールを使用しました。 例 # keyword module import keyword # Function def isKeyword(word) :    # list of all