문제

tier 바이러스

풀이

1번 컴퓨터에서 도달할 수 있는 컴퓨터는 모두 감염됩니다. 1번 컴퓨터를 시작으로 DFS 탐색하여 방문한 총 컴퓨터의 개수를 출력하면 됩니다. 단, 개수를 셀 때 1번 컴퓨터는 제외해야 합니다.

코드

Python

n = int(input())
 
adj = [[] for _ in range(n + 1)]
 
for _ in range(int(input())):
    u, v = map(int, input().split())
    adj[u].append(v)
    adj[v].append(u)
 
visited = [False] * (n + 1)
 
 
def dfs(u: int) -> int:
    visited[u] = True
    ret = 1
 
    for v in adj[u]:
        if not visited[v]:
            ret += dfs(v)
    return ret
 
 
print(dfs(1) - 1)

C++

#include <bits/stdc++.h>
using namespace std;
 
vector<vector<int>> adj;
vector<bool> visited;
 
int dfs(int u) {
    visited[u] = true;
    int ret = 1;
 
    for (int v : adj[u]) {
        if (not visited[v])
            ret += dfs(v);
    }
 
    return ret;
}
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int n;
    cin >> n;
 
    adj = vector(n + 1, vector<int>());
    visited = vector(n + 1, false);
 
    int m;
    cin >> m;
    while (m--) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
 
    cout << dfs(1) - 1;
 
    return 0;
}

Java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
 
public class Main {
    static ArrayList<ArrayList<Integer>> adj = new ArrayList<>();
    static boolean visited[];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int n = Integer.parseInt(br.readLine());
        for (int i = 0; i <= n; i++)
            adj.add(new ArrayList<>());
        visited = new boolean[n + 1];
        
        int m = Integer.parseInt(br.readLine());
        for (int i = 0; i < m; i++) {
            StringTokenizer tk = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(tk.nextToken()),
                v = Integer.parseInt(tk.nextToken());
            
            adj.get(u).add(v);
            adj.get(v).add(u);
        }
 
        bw.write(dfs(1) - 1 + "");
        bw.close();
    }
 
    static int dfs(int u) {
        visited[u] = true;
        int ret = 1;
 
        for (int v : adj.get(u)) {
            if (!visited[v])
                ret += dfs(v);
        }
 
        return ret;
    }
}