티스토리 뷰
출저 : https://www.acmicpc.net/problem/1325
"아직도 모르겠는 문제...ㅎㅎ"
나는 처음에 해당 문제를 DFS DP를 이용해서 풀었다. 아래와 같이... 근데 시간초과가 나더라... ㅎㅎ 생각의 전환이 필요했다.
<DFS DP 로 푼 소스>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.StringTokenizer; public class Main { static int n,m; static ArrayList<Integer>[] list; 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()); visited = new boolean[n+1]; list = new ArrayList[n+1]; dp = new int[n+1]; for (int i = 0; i <= n; i++) { list[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()); list[b].add(a); } for (int i = 1; i <= n; i++) { visited[i] = true; int res = solve(i); visited[i] = false; max = Math.max(max, res); } StringBuilder sb = new StringBuilder(); for (int i = 1; i <= n; i++) { if(dp[i] == max) sb.append(i+" "); } System.out.println(sb.toString()); } static int solve(int cur) { if(dp[cur] != 0) return dp[cur]; dp[cur] = 1; for( int next : list[cur]) { if(visited[next]) continue; visited[next] = true; dp[cur] += solve(next); visited[next] = false; } return dp[cur]; } } | cs |
<맞은 소스>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { static int n,m; static ArrayList<Integer>[] list; 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()); list = new ArrayList[n+1]; dp = new int[n+1]; for (int i = 0; i <= n; i++) { list[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()); list[a].add(b); } for (int i = 1; i <= n; i++) { visited = new boolean[n+1]; solve(i); } for (int i = 1; i <= n; i++) { max = Math.max(max, dp[i]); } StringBuilder sb = new StringBuilder(); for (int i = 1; i <= n; i++) { if(dp[i] == max) sb.append(i+" "); } System.out.println(sb.toString()); } static void solve(int cur) { visited[cur] = true; for( int next : list[cur]) { if(visited[next]) continue; dp[next]++; solve(next); } } } | cs |
'Study > 알고리즘 문제풀이' 카테고리의 다른 글
백준 16116. 작은 큐브러버 :: 돼지개발자 (0) | 2018.12.14 |
---|---|
백준 2206. 벽 부수고 이동하기 :: 돼지개발자 (0) | 2018.12.12 |
백준 1963. 소수 경로 :: 돼지개발자 (0) | 2018.12.11 |
백준 2573. 빙산 :: 돼지개발자 (0) | 2018.12.09 |
백준 3967. 매직 스타 :: 돼지개발자 (0) | 2018.12.09 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday