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

Pythonで色が交互になる最短経路


0、1、...、n-1というラベルの付いたノードを持つ有向グラフがあるとします。このグラフでは、各エッジが赤または青の色で色付けされており、自己エッジまたは平行エッジが存在する可能性があります。 red_edgesの各[i、j]は、ノードiからノードjへの赤い有向エッジを示します。同様に、blue_edgesの各[i、j]は、ノードiからノードjへの青い有向エッジを示します。長さnの配列回答を見つける必要があります。ここで、各answer [X]は、ノード0からノードXまでの最短パスの長さであり、エッジの色がパスに沿って交互になります(パスがそうでない場合は-1)。存在します。

したがって、入力がn =3、red_edges =[[0,1]、[1,2]]およびblue_edges =[]の場合、出力は[0、1、-1]

になります。

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

  • bfs()というメソッドを定義します。これには、re、be、f、nが必要です

  • 訪問済みと呼ばれるセットを定義し、キューを定義して、トリプレット[0、f、0]

    を挿入します。
  • qが空ではない間

    • トリプレット電流、色、ステップをq [0]として設定し、qから削除します

    • color:=色の値を補完します(trueからfalse、またはその逆)

    • res [current]:=res[current]とstepの最小値

    • 色がゼロ以外の場合、

      • re [current]

        の各iについて
        • ペア(i、color)がvisitedにない場合は、(i、color)をvisitedに挿入し、[i、color、step+1]をqに挿入します

    • それ以外の場合、色が0の場合、

      • [現在]

        の各iについて
        • ペア(i、color)がvisitedにない場合は、(i、color)をvisitedに挿入し、[i、color、step+1]をqに挿入します

  • 主な方法で-

  • res:=無限大の値の配列であり、そのサイズはn

  • re and be:=n個の空の配列の配列

  • rの各要素iについて:i[1]をre[i [0]]

    に挿入します
  • bの各要素iについて:i[1]をbe[i [0]]

    に挿入します
  • bfs(re、be、false、n)を呼び出し、bfs(re、be、true、n)を呼び出します

  • 0からresの長さまでの範囲のiの場合– 1

    • res [i] =infの場合、res [i]:=-1

  • 解像度を返す

例(Python)

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

class Solution(object):
   def shortestAlternatingPaths(self, n, r, b):
      self.res = [float("inf")] * n
      re = [[] for i in range(n) ]
      be = [[] for i in range(n) ]
      for i in r:
         re[i[0]].append(i[1])
      for i in b:
         be[i[0]].append(i[1])
      self.bfs(re,be,False,n)
      self.bfs(re,be,True,n)
      for i in range(len(self.res)):
         if self.res[i] == float('inf'):
            self.res[i]=-1
      return self.res
   def bfs(self,re,be,f,n):
      visited = set()
      queue = [[0,f,0]]
      while queue:
         current,color,step = queue[0]
         queue.pop(0)
         color = not color
         self.res[current] = min(self.res[current],step)
         if color:
            for i in re[current]:
               if (i,color) not in visited:
                  visited.add((i,color))
                  queue.append([i,color,step+1])
         elif not color:
            for i in be[current]:
               if (i,color) not in visited:
                  visited.add((i,color))
                  queue.append([i,color,step+1])
ob = Solution()
print(ob.shortestAlternatingPaths(3, [[0,1], [1,2]], []))

入力

3
[[0,1],[1,2]]
[]

出力

[0,1,-1]

  1. PythonでOpenCVを使用して特定の色(ここでは青)を検出しますか?

    多くの人にとって、画像処理は恐ろしくて骨の折れる作業のように見えるかもしれませんが、多くの人が思っているほど難しくはありません。このチュートリアルでは、Pythonを使用してopenCvで基本的な色検出を行います。 コンピューターで色はどのように機能しますか? コンピューター上の色は、基本的に色の範囲を数字のタプルとして表す色空間またはカラーモデルで表します。 各色を使用する代わりに、使用する最も一般的な色空間について説明します。 RGB(赤、緑、青)およびHSV(色相、彩度、値)。 RGBは基本的に、色を3つのコンポーネントのタプルとして記述します。各コンポーネントは0〜255の値を取

  2. 条件付き書式を使用した Excel の交互行の色 [ビデオ]

    このビデオ チュートリアル Excel の交互の行の色 条件付き書式の使用 、次の 3 つのトピックを学習します: 交互の行をハイライト 市松模様を作る 交互に 4 行をシェーディング Excel の交互の行の色 – 交互の行を強調表示 このビデオ講義では: オンラインで Excel を学ぶ:トップ Excel コース オンライン 数式ベースの条件付き書式を使用して、行を交互に強調表示する方法を学習します。 MOD() 関数と ROW() 関数を使用して数式を作成します。 続きを読む: Excel で結合セルの代替行に色を付ける方法 Excel の交互の行の色 –