[白俊]2606号:ウイルス
6464 ワード
質問する
新型ウイルスワームウイルスはネットワークを通じて伝播する.1台のコンピュータがワームウイルスに感染した場合、ネットワークに接続されているすべてのコンピュータがワームウイルスに感染します.
例えば、<図1>に示すように、7台のコンピュータがネットワークに接続されているとする.1番のコンピューターがワームウイルスに感染した場合、ワームウイルスは2番と5番のコンピューターを経て3番と6番のコンピューターに伝播し、2、3、5、6の4台のコンピューターがワームウイルスに感染する.しかし、4番と7番は1番とネットワーク接続がないため、影響を受けません.
ある日、1番のパソコンがワームウイルスに感染した.コンピュータの数とネットワーク上の情報が相互に接続されている場合は、コンピュータを介してワームウイルスに感染したコンピュータの数を出力するプログラムを作成します.
入力
最初の行はコンピュータの数を示します.パソコンの数は100以下で、1台あたり1番から順番に番号をつけます.2行目は、ネットワークに直接接続されているコンピュータペアの数を示します.次に、ネットワークに直接接続された各行の1対のコンピュータの番号ペアが与えられる.
解説
1番のパソコンに接続されているすべてのパソコンがワームウイルスに感染します.この場合、1番パソコンに感染したパソコンの数を要求する必要があります.つまり、1番に属する接続素子のノード数を求めることができる.これは、DFSの起点を1番コンピュータとし、1番コンピュータに接続されたすべてのノードにアクセスし、
infection += 1
を行う.このため、infection
をグローバル変数として処理する.import sys
# 그래프 안의 연결 컴포넌트 중 하나의 노드만 바이러스에 걸려도
# 연결 컴포넌트에 속하는 모든 노드가 바이러스에 감염된다.
# 1번 컴퓨터가 웜 바이러스에 걸렸다.
# 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수?
infection = -1
def dfs(graph, v, visited):
visited[v] = True
global infection
infection += 1
for i in graph[v]:
if (not visited[i]):
dfs(graph, i, visited)
N = int(sys.stdin.readline())
E = int(sys.stdin.readline())
graph = [ [] for x in range(N+1) ]
visited = [ False ] * (N+1)
for i in range(E):
u, v = map(int, sys.stdin.readline().rstrip().split())
graph[u].append(v)
graph[v].append(u)
for i in range(N+1):
graph[i].sort()
dfs(graph, 1, visited)
print(infection)
Reference
この問題について([白俊]2606号:ウイルス), 我々は、より多くの情報をここで見つけました https://velog.io/@scv1702/백준-2606번-바이러스テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol