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

Pythonで最大のネットワークランクを見つけるプログラム


n個の都市があり、これらの都市を結ぶ道路がいくつかあるとします。各roads[i]=[u、v]は、都市uとvの間に双方向の道路があることを示します。ネットワークランクは、いずれかの都市に直接接続されている道路の総数であると考えてください。道路が両方の都市に直接接続されている場合、1回だけカウントされます。また、ネットワークの最大ネットワークランクは、異なる都市のすべてのペアの最大ネットワークランクです。したがって、道路が異なる場合は、ネットワーク全体の最大ネットワークランクを見つける必要があります。

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

Pythonで最大のネットワークランクを見つけるプログラム

都市1と2を接続する方法は5つあるため、出力は5になります

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

  • n:=ノードの数
  • s:=新しいセット
  • d:=マップ、キーが存在しない場合は0を返します
  • 道路の各エッジ(x、y)について、
    • d [x]:=d [x] + 1
    • d [y]:=d [y] + 1
    • ペア(x、y)をdに挿入します
    • ans:=0
  • l:=0からnまでの新しいリスト
  • ノード番号に基づいてlを降順で並べ替えます
  • しきい値:=最小のd[l[0]]およびd[l[1]]
  • 範囲0からl-1のサイズのiの場合、do
    • 範囲i+1からl-1のサイズのjの場合、do
      • d [l [j]] <しきい値の場合、
        • ループから抜け出す
      • curr:=d [l [i]] + d [l [j]]
      • (l [i]、l [j])がsに存在する場合、または(l [j]、l [i])がsに存在する場合、
        • curr:=curr-1
      • ans:=ansとcurrの最大値
  • 回答を返す

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

from collections import defaultdict
def solve(roads):
   nodes = set()
   s = set()
   d = defaultdict(int)
   for x,y in roads:
      nodes.update([x,y])
      d[x]+=1
      d[y]+=1
      s.add((x,y))

   ans = 0
   n = len(nodes)
   l = list(range(n))
   l.sort(key=lambda x:d[x], reverse = True)
   threshold = min(d[l[0]],d[l[1]])
   for i in range(len(l)-1):
      for j in range(i+1,len(l)):
         if d[l[j]]<threshold:
            break
      curr = d[l[i]]+d[l[j]]
      if (l[i],l[j]) in s or (l[j],l[i]) in s:
         curr-=1
      ans = max(ans,curr)
   return ans

roads = [(0,1),(0,3),(1,2),(1,3),(2,3),(2,4)]
print(solve(roads))

入力

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

出力

5

  1. Pythonでポリゴンの領域を見つけるプログラム

    順序付けられたポイントのリストが2D平面上の単純なポリゴンエンドポイントを表すとします。このポリゴンの領域を見つける必要があります。 したがって、入力がpoints =[(0、0)、(0,5)、(3、5)、(3,0)]のような場合、出力は15になります。 これを解決するには、次の手順に従います- 関数getInfo()を定義します。これにはx1、y1、x2、y2が必要です return x1 * y2-y1 * x2 メインの方法から、次の手順を実行します N:=ポイントのサイズ (firstx、firsty):=points [0] (prevx、prevy):=(fir

  2. Pythonでポリゴンの周囲を見つけるプログラム

    順序付けられたポイントのリストが2D平面上の単純なポリゴンエンドポイントを表すとします。このポリゴンの周囲を見つける必要があります。 したがって、入力がpoints =[(0、0)、(0,5)、(3、5)、(3,0)]のような場合、出力は16になります。 2つの辺の長さは3で、2つの辺の長さは5なので、2 * 5 + 2 * 3=16です。 これを解決するには、次の手順に従います- 関数getInfo()を定義します。これにはx1、y1、x2、y2が必要です ユークリッド距離である((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))の平方根を返します (x1、y1)