Blog Content

    티스토리 뷰

    [그래프/개념] 그래프 사이클 찾기 (방향, 무방향), DFS Cycle java

    무방향 그래프에 사이클이 존재하는지의 여부를 확인하는 java 코드입니다.

    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
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Stack;
    import java.util.StringTokenizer;
     
    // http://clearpal7.blogspot.kr/2016/10/cycle.html
    // 무방향 그래프 -> cycle찾기
    public class isCycle {
        static int N, M, T, cnt, flag;
        static ArrayList<Integer> adj[];
        static boolean visited[];
     
        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st;
            T = Integer.parseInt(br.readLine());
            for(int test_case = 1; test_case <=T; test_case++){
                st = new StringTokenizer(br.readLine());
                N = Integer.parseInt(st.nextToken());
                M = Integer.parseInt(st.nextToken());
                
                adj = new ArrayList[N+1];
                for(int i=1; i<=N; i++){
                    adj[i] = new ArrayList<>();
                }
                for(int i=1; i<=M; i++){
                    st = new StringTokenizer(br.readLine());
                    int u = Integer.parseInt(st.nextToken());
                    int v = Integer.parseInt(st.nextToken());
                    adj[u].add(v);
                    adj[v].add(u);
                }
                visited = new boolean[N+1];
                if(isDfsCycle(1-1)){
                    System.out.println("사이클이다");
                }else{
                    System.out.println("사이클 아니다");
                }
            }
        }
     
        private static boolean isDfsCycle(int curr, int parent) {
            visited[curr] = true;
            for(int next : adj[curr]){
                if(!visited[next]){
                    if(isDfsCycle(next, curr)){
                        return true;
                    }
                }else if(next != parent){
                    return true;
                }
            }
            return false;
        }
     
     
    }
     
    cs


    Comments