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

グラフがPythonのすべての人によってトラバース可能かどうかを確認するプログラム


0からn-1までの番号が付けられたn個の頂点を含むグラフが与えられたとします。グラフは無向であり、各エッジには重みがあります。グラフには3種類の重みを設定でき、各重みは特定のタスクを示します。グラフをトラバースできるのは、ジャックとケーシーの2人です。エッジの重みが1の場合、ジャックはグラフをトラバースできます。重みが2の場合、ケーシーはグラフをトラバースできます。エッジの重みが3の場合、両方がグラフをトラバースできます。グラフを両方でトラバース可能にするために必要なエッジをすべて削除する必要があります。ジャックとケーシー。グラフをトラバース可能にするために削除するエッジの数を返します。トラバース可能にできない場合は-1を返します。

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

グラフがPythonのすべての人によってトラバース可能かどうかを確認するプログラム

およびn=5;その場合、出力は-1になります

エッジを削除しても、グラフを両方でトラバース可能にすることはできません。したがって、答えは-1です。

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

  • 関数find()を定義します。これにはvalが必要です

    • valがroot[val]と同じでない場合、

      • root [val]:=find(root [val])

    • ルートを返す[val]

  • 関数union()を定義します。これにはval1、val2が必要です

    • val1:=find(val1)

    • val2:=find(val2)

    • val1がval2と同じ場合、

      • 0を返す

    • root [val1]:=val2

    • 1を返す

  • res:=0

  • edge1:=0

  • edge2:=0

  • root:=0からn+1までの範囲の新しいリスト

  • 各エッジ(u、v)、およびeの重みwについて、実行します

    • uが3と同じ場合、

      • union(v、w)がゼロ以外の場合、

        • edge1:=edge1 + 1

        • edge2:=edge2 + 1

      • それ以外の場合

        • res:=res + 1

  • root0:=root[インデックス0から終了まで]

  • 各エッジ(u、v)、およびeの重みwについて、実行します

    • uが1と同じ場合、

      • union(v、w)がゼロ以外の場合、

        • edge1:=edge1 + 1

      • それ以外の場合

        • res:=res + 1

  • root:=root0

  • 各エッジ(u、v)、およびeの重みwについて、実行します

    • uが2と同じ場合、

      • union(v、w)がゼロ以外の場合、

        • edge2:=edge2 + 1

      • それ以外の場合

        • res:=res + 1

  • edge1がedge2およびn-1と同じである場合、resを返します

  • それ以外の場合は、-1を返します

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

def solve(n, e):
   def find(val):
      if val != root[val]:
         root[val] = find(root[val])
      return root[val]
   def union(val1, val2):
      val1, val2 = find(val1), find(val2)
      if val1 == val2: return 0
      root[val1] = val2
      return 1
   res = edge1 = edge2 = 0
   root = list(range(n + 1))
   for u, v, w in e:
      if u == 3:
         if union(v, w):
            edge1 += 1
            edge2 += 1
         else:
            res += 1
   root0 = root[:]
   for u, v, w in e:
      if u == 1:
         if union(v, w):
            edge1 += 1
      else:
            res += 1
   root = root0
   for u, v, w in e:
      if u == 2:
         if union(v, w):
            edge2 += 1
         else:
            res += 1
   return res if edge1 == edge2 == n - 1 else -1
print(solve(5, [(0,1,1),(1,2,2),(2,3,3),(3,4,1),(4,0,2)]))

入力

Input:
5, [(0,1,1),(1,2,2),(2,3,3),(3,4,1),(4,0,2)]

出力

-1

  1. グラフ内の最大のクリークの最小サイズを見つけるプログラム(Python)

    グラフが与えられ、グラフ内の最大のクリークの最小サイズを見つけるように求められたとします。グラフのクリークは、頂点のすべてのペアが隣接している、つまり頂点のすべてのペアの間にエッジが存在するグラフのサブセットです。グラフ内で最大のクリークを見つけることは多項式時間では不可能であるため、小さなグラフのノードとエッジの数を考えると、グラフ内の最大のクリークを見つける必要があります。 したがって、入力がノード=4、エッジ=4のような場合。その場合、出力は2になります。 上のグラフでは、クリークの最大サイズは2です。 これを解決するには、次の手順に従います- 関数helper()を定義し

  2. Pythonのグラフでクリティカルエッジと疑似クリティカルエッジを見つけるプログラム

    0からn-1までの番号が付けられたn個の頂点を含むグラフが与えられたとします。グラフは無向であり、各エッジには重みがあります。したがって、グラフが与えられた場合、グラフMSTのクリティカルエッジと疑似クリティカルエッジを見つける必要があります。エッジを削除するとMSTの重みが増加する場合、そのエッジはクリティカルエッジと呼ばれます。疑似クリティカルエッジは、すべてではなく、すべてのグラフMSTに表示できるエッジです。グラフを入力として与えられたエッジのインデックスを見つけます。 したがって、入力が次のような場合 頂点の数が5の場合、出力は[[]、[0、1、2、3、4]]になります。指