시간 제한 : 5초, 난이도 : 실버1, 백준 : 1325번

visited 배열을 int[]로 바꾸면 새로 만들 필요가 없어집니다.

어떤 정점을 방문했을 때는 visited에 num을 넣어줍니다.

아직 방문하지 않은 정점들은 visited에 num보다 작은 숫자가 들어 있으므로 bfs를 문제 없이 수행할 수 있습니다.

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.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Practice47 {
	static int N, M;
	static boolean visited[];
	static int answer[];
	static ArrayList<Integer> A[];

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		A = new ArrayList[N + 1];
		answer = new int[N + 1];
		for(int i = 1; i <= N; i++) {
			A[i] = new ArrayList<>();
		}
		for(int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int S = Integer.parseInt(st.nextToken());
			int E = Integer.parseInt(st.nextToken());
			A[S].add(E); // 여기 A[E].add(S);
		} // 정방향일때 돌아갑니다. 역방향일때 안 돌아간다.
		for(int i = 1; i <= N; i++) {
			visited = new boolean[N + 1]; 
			BFS(i);
		}
		int maxVal = 0;
		for(int i = 1; i <= N; i++) {
			maxVal = Math.max(maxVal,  answer[i]);
		}
		for(int i = 1; i <= N; i++) {
			if(answer[i] == maxVal)
				System.out.print(i + " ");
		}		
		
	}

	public static void BFS(int index) {
		Queue<Integer> queue = new LinkedList<Integer>(); //ArrayDeque으로 변경하면 돌아감
		queue.add(index);
		visited[index] = true;
		while(!queue.isEmpty()) {
			int now_Node = queue.poll();
			for(int i : A[now_Node]) {
				if(visited[i] == false) {
					visited[i] = true;
					answer[i]++;
					queue.add(i);
				}
			}
		}
	}
}

아래도 시간 초과


import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Practice47 {
	static int N, M;
	static boolean visited[];
	static int answer[];
	static ArrayList<Integer> A[];

	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		
		N = sc.nextInt();
		M = sc.nextInt();
		
		A = new ArrayList[N + 1];
		
		answer = new int[N + 1];		
		for(int i = 1; i <= N; i++) {
			A[i] = new ArrayList<>();
		}
		for(int i = 0; i < M; i++) {
			int S = sc.nextInt();
			int E = sc.nextInt();
			A[S].add(E);
		}
				
		
		for(int i = 1; i <= N; i++) {
			visited = new boolean[N + 1];
			BFS(i);
		}
		
		int maxVal = 0;
		for(int i = 1; i <= N; i++) {
			maxVal = Math.max(maxVal, answer[i]);
		}
		
		for(int i = 1; i <= N; i++) {
			if(answer[i] == maxVal)
				System.out.print(i + " ");
		}		
		
		sc.close();
	}

	public static void BFS(int index) {
		Queue<Integer> queue = new LinkedList<Integer>();
		queue.add(index);
		visited[index] = true;
		while(!queue.isEmpty()) {
			int now_Node = queue.poll();
			for(int i : A[now_Node]) {
				if(visited[i] == false) {
					visited[i] = true;
					answer[i]++;
					queue.add(i);
				}
			}
		}
	}
}

아래도 시간 초과


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Practice47 {
    static int N, M;
    static ArrayList<Integer>[] graph;
    static int[] dp;
    static boolean[] visited;
    static int max = Integer.MIN_VALUE;

	public static void main(String[] args) throws IOException{
		 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	        StringTokenizer st = new StringTokenizer(br.readLine());

	        N = Integer.parseInt(st.nextToken());
	        M = Integer.parseInt(st.nextToken());

	        graph = new ArrayList[N + 1];
	        dp = new int[N + 1];

	        for (int i = 1; i <= N; i++) {
	            graph[i] = new ArrayList<>();
	        }

	       
	        for (int i = 0; i < M; i++) {
	            st = new StringTokenizer(br.readLine());
	            int A = Integer.parseInt(st.nextToken());
	            int B = Integer.parseInt(st.nextToken());
	            graph[B].add(A);
	        }

	        for (int i = 1; i <= N; i++) {
	            visited = new boolean[N + 1];
	            dp[i] = dfs(i);
	            max = Math.max(max, dp[i]);
	        }

	        for (int i = 1; i <= N; i++) {
	            if (dp[i] == max) {
	                System.out.print(i + " ");
	            }
	        }
	}

	static int dfs(int node) {
        visited[node] = true;
        int count = 1;

        for (int next : graph[node]) {
            if (!visited[next]) {
                count += dfs(next);
            }
        }

        return count;
    }
}

// DFS로 돌아가는 코드입니다.(여진) 이해 못함.

public class Main {

    static final int N = 10001;
    static int max = 0;

    static List<Integer>[] list = new ArrayList[N];
    static List<Integer> result = new ArrayList<>();
    static boolean[] visit = new boolean[N];
    static int[] connect = new int[N];

    static void DFS(int current){

        visit[current] = true;

        for(int next : list[current])
            if(!visit[next]) {
                connect[next]++;
                DFS(next);
            }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        for(int i=1; i<=n; i++) {
            list[i] = new ArrayList<>();
        }

        for(int i=1; i<=m; i++){
            st = new StringTokenizer(br.readLine());

            int home = Integer.parseInt(st.nextToken());
            int target = Integer.parseInt(st.nextToken());

            list[home].add(target);
        }

        for(int i=1; i<=n; i++) {
            visit = new boolean[N];
            DFS(i);
        }

        for(int i=1; i<=n; i++)
            if (connect[i] > max) {
                max = connect[i];
                result.clear();
                result.add(i);
            } else if (connect[i] == max)
                result.add(i);

        for(int a:result)
            System.out.print(a + " ");
    }
}
//BFS로 돌아가는 코드~(소망)
import java.io.*;
import java.util.*;

public class Main {
    static int N, M, max = 0;
    static ArrayList<Integer>[] graph;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        graph = new ArrayList[N + 1];
        for (int i = 1; i <= N; i++) graph[i] = new ArrayList<>();

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            graph[b].add(a); 
        }

        int[] result = new int[N + 1];

        for (int i = 1; i <= N; i++) {
            boolean[] visited = new boolean[N + 1];
            Queue<Integer> q = new LinkedList<>();
            q.add(i);
            visited[i] = true;

            int count = 0;

            while (!q.isEmpty()) {
                int cur = q.poll();
                for (int next : graph[cur]) {
                    if (!visited[next]) {
                        visited[next] = true;
                        q.add(next);
                        count++;
                    }
                }
            }

            result[i] = count;
            max = Math.max(max, count);
        }

        for (int i = 1; i <= N; i++) {
            if (result[i] == max) System.out.print(i + " ");
        }
    }
}