24480번

2023. 1. 20. 10:03·CS 이론/알고리즘
728x90

https://www.acmicpc.net/problem/24480

 

24480번: 알고리즘 수업 - 깊이 우선 탐색 2

첫째 줄에 정점의 수 N (5 ≤ N ≤ 100,000), 간선의 수 M (1 ≤ M ≤ 200,000), 시작 정점 R (1 ≤ R ≤ N)이 주어진다. 다음 M개 줄에 간선 정보 u v가 주어지며 정점 u와 정점 v의 가중치 1인 양

www.acmicpc.net

저번에 이어서 DFS기초 문제를 다시 풀어보았다. 저번과 같은 코드이지만 내림차순이어서 인접 리스트의 정렬을 내림차순으로 바꿔주기만 하면 된다.

너무 간단한 문제여서 오늘은 짧게 설명하겠다.

방문 여부를 판단하는 boolean배열과 순서를 담을 int배열

그리고 순서값을 셀 count 그리고 node의 갯수가 있으면, boolean배열의 T,F를 판별하여고,

방문하지 않은 노드라면 T로 바꾸어주고, 순서를 담는 배열에 넣어준다.

그 다음에 인접리스트를 내림차순으로 정렬하여 인접행렬에 접근하는 재귀함수를 돌려주면 된다.

 

정답 코드는 아래와 같다.

 

package backjoon.b24480;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class b24480 {
    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());
        int R = Integer.parseInt(st.nextToken());
        Graph g = new Graph(N);
        for(int i=0; i<M; i++){
            st = new StringTokenizer(br.readLine());
            int u= Integer.parseInt(st.nextToken());
            int v= Integer.parseInt(st.nextToken());
            g.addEdge(u,v);
        }
        g.dfs(R);
        StringBuilder sb = new StringBuilder();
        for(int i : g.order){
            sb.append(i).append("\n");
        }
        System.out.println(sb);
    }
}
class Graph{
    int node;
    boolean[] visit;
    LinkedList<Integer>[] adj;
    int[] order;
    int count=1;
    public Graph(int node){
        this.node = node;
        visit = new boolean[node+1];
        adj = new LinkedList[node+1];
        for(int i=0; i<=node; i++){
            adj[i] = new LinkedList<>();
        }
        order = new int[node];
    }
    public void addEdge(int u, int v){
        adj[u].add(v);
        adj[v].add(u);
    }
    public void dfs(int R){
        if(visit[R]){
           return;
        }
        visit[R]=true;
        adj[R].sort((a,b)->a>b?-1:(a==b?0:1));
        order[R-1]=count++;
        for(int i:adj[R]){
            dfs(i);
        }
    }
}

 

728x90

'CS 이론 > 알고리즘' 카테고리의 다른 글

2606번  (1) 2023.01.23
24444번  (0) 2023.01.21
11286번  (2) 2023.01.19
24479번  (0) 2023.01.18
14888번  (0) 2023.01.17
'CS 이론/알고리즘' 카테고리의 다른 글
  • 2606번
  • 24444번
  • 11286번
  • 24479번
Bello's
Bello's
개발하는 벨로
  • Bello's
    벨로의 개발일지
    Bello's
  • 전체
    오늘
    어제
    • 분류 전체보기 (199)
      • 노예 일지 (7)
        • 스타트업 노예일지 (3)
      • CS 이론 (81)
        • 학과 수업 (4)
        • 알고리즘 (64)
        • 시스템 프로그래밍 (3)
        • 데이터 통신 (1)
        • 운영체제 (2)
        • 데이터베이스 (1)
      • project (3)
      • 나는 감자다. (4)
      • Spring (27)
      • 모각코 (45)
        • 절개와지조(모각코) (7)
        • 어쩌다보니 박준태가 조장이조 (11)
        • 어쩌다보니 박준태가 또 조장이조 (12)
      • LikeLion🦁 (20)
      • 캘리포니아 감자 (4)
      • OpenSource Contribute (1)
      • 우아한테크벨로 (1)
        • 프리코스 회고록 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    8기
    어렵다
    티스토리챌린지
    프리코스
    모각코
    자바
    타임리프
    뛰슈
    절개와지조
    그래프 순회
    BFS
    나는 감자
    회고록
    감자
    오블완
    백준
    DFS
    JPA
    Spring
    누적합
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Bello's
24480번
상단으로

티스토리툴바