[鐘万北]ハイキング
2283 ワード
展開
に近づく
ルールに従って状況の数を計算します.
[原句]いつも友達同士の学生だけがペアになれる.
2.一部の学生がペアになっていても、違う方法です.
1.隣接リストとして保存し、完全にナビゲートする
最初に思いついた方法で,友人関係図を隣接リストとして保存した後,深さ優先探索により答えが得られた.
隣接テーブルで資料を保存し,一方向ブラウズを行い,同一ペアの繰返し計算を解消しようとしたが,可能なすべてのペアが完全にブラウズできない場合が発生した.
一方的に資料を保存するのではなく、次のペアを探すために加入したコードなどを修正した結果、隣接リストで資料を保存する意味がなくなりました.
...このときコードを逆さまにして書き直します.
2.リレーショナル・マトリクスとして保存し、完全にナビゲート
友人関係図を無方向性の関係行列として格納し,深さ優先探索を行い,答えを導いた.
残りの半分が見つかった場合、DFSにアクセスする配列が格納されているかどうかのように、グラフィックの方向性にかかわらず、個別のタグは重複を解消することができます.
また,この問題の資料を方向図として保存すると,前述したすべての項目を探索できないという問題が発生し,かえって困難になることが分かった.
したがって、新しいコードは、
コード2-リレーショナルマトリクスとアクセス状況配列を使用してDFSを実現
に近づく
ルールに従って状況の数を計算します.
[原句]いつも友達同士の学生だけがペアになれる.
2.一部の学生がペアになっていても、違う方法です.
1.隣接リストとして保存し、完全にナビゲートする
最初に思いついた方法で,友人関係図を隣接リストとして保存した後,深さ優先探索により答えが得られた.
隣接テーブルで資料を保存し,一方向ブラウズを行い,同一ペアの繰返し計算を解消しようとしたが,可能なすべてのペアが完全にブラウズできない場合が発生した.
一方的に資料を保存するのではなく、次のペアを探すために加入したコードなどを修正した結果、隣接リストで資料を保存する意味がなくなりました.
...このときコードを逆さまにして書き直します.
2.リレーショナル・マトリクスとして保存し、完全にナビゲート
友人関係図を無方向性の関係行列として格納し,深さ優先探索を行い,答えを導いた.
残りの半分が見つかった場合、DFSにアクセスする配列が格納されているかどうかのように、グラフィックの方向性にかかわらず、個別のタグは重複を解消することができます.
また,この問題の資料を方向図として保存すると,前述したすべての項目を探索できないという問題が発生し,かえって困難になることが分かった.
solved_friends
に他の半分の友人が見つかったことを表示する方法を選択し、繰り返しブラウズを回避する.コード2-リレーショナルマトリクスとアクセス状況配列を使用してDFSを実現
from sys import stdin
test_case = int(stdin.readline())
def solve(solved_friends):
global pairs, n
next_friend = -1
for i in range(n):
if solved_friends[i] == False:
next_friend = i
break
if next_friend == -1:
return 1
res = 0
for i in range(next_friend, n, 1):
if (not solved_friends[i]) and pairs[i][next_friend]:
solved_friends[i] = solved_friends[next_friend] = True
res += solve(solved_friends)
solved_friends[i] = solved_friends[next_friend] = False
return res
while test_case:
n, m = map(int, stdin.readline().strip().split())
pairs = [[False for _ in range(n)] for _ in range(n)]
PAIRS_RAW = tuple(int(i) for i in stdin.readline().strip().split())
for i in range(0, len(PAIRS_RAW), 2):
pairs[PAIRS_RAW[i]][PAIRS_RAW[i + 1]] = True
pairs[PAIRS_RAW[i + 1]][PAIRS_RAW[i]] = True
print(solve([False for _ in range(n)]))
test_case -= 1
最終的には本の中の解答に似たコードとなり、時事も似ている.solve
関数内の2番目の繰り返し文では、次のペアリングを探索するために再帰的に呼び出される部分(20〜22行目)が表示される.solved_friends
の各エントリは、呼び出しのためにTrue
に保持され、その後、False
に置き換えられることにより、DFSにおいて簡単なナビゲーションを追加のステップを必要とせずに行うことができる.solve
関数に戻り値が含まれているres
を見てみましょう.このように検索結果は,伴がなければ0を返し,伴があれば個数を返し,非常に便利であることを示した.Reference
この問題について([鐘万北]ハイキング), 我々は、より多くの情報をここで見つけました https://velog.io/@gmelan/종만북-소풍テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol