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

Pythonで敵が同じグループにとどまることができない人を分離するプログラム


数nと敵と呼ばれる2D行列があるとします。ここで、nは、[0、n-1]からラベル付けされたn人がいることを示します。これで、敵の各行に[a、b]が含まれます。これは、aとbが敵であることを意味します。敵である2人が同じグループに入らないように、n人を2つのグループに分割できるかどうかを確認する必要があります。

したがって、入力がn =4、敵=[[0、3]、[3、2]]の場合、これら2つのグループ[0、1、2]と[を使用できるため、出力はTrueになります。 3]。

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

  • グラフ:=空の隣接リスト

  • 敵の各敵ペア(u、v)について、実行します

    • グラフの最後にvを挿入します[u]

    • グラフの最後にuを挿入します[v]

  • 色:=新しい地図

  • 関数dfs()を定義します。これにはu、c:=0が最初にかかります

  • uがカラーの場合、

    • color[u]がc

      と同じ場合はtrueを返します
  • color [u]:=c

  • グラフ[u]の各vのすべてのdfs(v、c XOR 1)がtrueの場合、trueを返します

  • メインの方法から、次のようにします-

  • (0からnの範囲の各uのdfs(u)で、uがカラーでない場合)がすべてtrueの場合にtrueを返します

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

class Solution:
   def solve(self, n, enemies):
      from collections import defaultdict
      graph = defaultdict(list)
      for u, v in enemies:
         graph[u].append(v)
         graph[v].append(u)
      color = {}
      def dfs(u, c=0):
         if u in color:
            return color[u] == c
            color[u] = c
            return all(dfs(v, c ^ 1) for v in graph[u])
         return all(dfs(u) for u in range(n) if u not in color)
ob = Solution()
n = 4
enemies = [[0, 3],[3, 2]]
print(ob.solve(n, enemies))

入力

4, [[0, 3],[3, 2]]

出力

True

  1. Pythonで隣接するノードが同じ色を持たないツリーに色を付けることができるかどうかを確認するプログラム

    各ノードの値がその色を表す二分木があるとします。木にはせいぜい2色しかありません。接続されている2つのノードが同じ色にならないように、ノードの色を何度でも交換できるかどうかを確認する必要があります。 したがって、入力が次のような場合 そうすれば、出力はTrueになります これを解決するには、次の手順に従います- 色:=空の地図 prop:=空のマップ 関数dfs()を定義します。これはノードを取り、フラグを立てます ノードがnullの場合、 戻る 色[ノードの値]:=色[ノードの値] + 1 prop [flag]:=prop [flag] + 1 dfs(

  2. マルチリスト内の同じインデックスにあるPythonグループ要素

    このチュートリアルでは、同じインデックスの異なるリストの要素を1つのリストに結合するプログラムを作成します。そして、ここには1つの制約があります。すべてのリストは同じ長さである必要があります。それをより明確に理解するために例を見てみましょう。 入力 [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 出力 [[1, 4, 7], [2, 5, 8], [3, 6, 9]] さまざまな方法で解決できます。通常のループで解決する方法を見てみましょう。 リストを使用してリストを初期化します。 空のリストを初期化します。 変数のインデックスを初期化します 0に。 サブリストの長さの