[Baekjoon][Python]2606号ウイルス
2606号ウイルス
この問題はDFSで解決できる.
グラフを実装するためにグラフというクラスを自分で作成しました.
Pythonではディック・シャナリーとリストで隣接リストを容易に実現できる.
問題をよく観察する場合は、すべてのグラフィックを作成した後、1番ノードからDFSナビゲーションを行い、アクセスなしでcountを増やすだけです.countは感染したパソコンの数です.最初は1番ノードにアクセスするので、出力時には-1しか必要ありません.
コードは次のとおりです.
今回の問題はDFSアルゴリズムを使って、概念を勉強すれば、いろいろな面でうまく使えるということです.Pythonでグラフを実現することに慣れていないため、コードの整理はあまりはっきりしていませんが、今後のコードでは、より簡潔なコードを書くことができるはずです.
質問する
に答える
この問題はDFSで解決できる.
グラフを実装するためにグラフというクラスを自分で作成しました.
Pythonではディック・シャナリーとリストで隣接リストを容易に実現できる.
問題をよく観察する場合は、すべてのグラフィックを作成した後、1番ノードからDFSナビゲーションを行い、アクセスなしでcountを増やすだけです.countは感染したパソコンの数です.最初は1番ノードにアクセスするので、出力時には-1しか必要ありません.
コードは次のとおりです.
import sys
class Graph:
def __init__(self):
self.graph = {}
def addVertex(self, vertex):
self.graph[vertex] = []
def addEdge(self, startVertex, endVertex):
self.graph[startVertex].append(endVertex)
def searchInfection(graph, startVertex, visited, count):
visited[startVertex] = 1
count += 1
for s in graph.graph[startVertex]:
if visited[s] != 1:
visited, count = searchInfection(graph, s, visited, count)
return visited, count
# 컴퓨터의 수
N = int(sys.stdin.readline())
# 그래프 선언
cGrpah = Graph()
visited = []
# vertex 추가
for i in range(N):
cGrpah.addVertex(i + 1)
visited.append(0)
visited.append(0)
# 연결된 컴퓨터 쌍 수
M = int(sys.stdin.readline())
# edge 추가
for i in range(M):
c1, c2 = map(int, sys.stdin.readline().split())
cGrpah.addEdge(c1, c2)
cGrpah.addEdge(c2, c1)
# 검색
count = 0
visited, count = searchInfection(cGrpah, 1, visited, count)
# 방문한 노드 개수
print(count - 1)
n/a.結論
今回の問題はDFSアルゴリズムを使って、概念を勉強すれば、いろいろな面でうまく使えるということです.Pythonでグラフを実現することに慣れていないため、コードの整理はあまりはっきりしていませんが、今後のコードでは、より簡潔なコードを書くことができるはずです.
Reference
この問題について([Baekjoon][Python]2606号ウイルス), 我々は、より多くの情報をここで見つけました https://velog.io/@ktaewon98/BaekjoonPython-2606번-바이러스テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol