Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
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
Tags
more
Archives
Today
Total
관리 메뉴

선진이네

[JAVA] 인접 리스트 본문

Language/JAVA

[JAVA] 인접 리스트

악마선진 2022. 8. 30. 10:10

인접행렬, 인접 리스트 몇번을 봐도 이해가 안 되기에 한 번 정리하고 넘어가겠다.

 

각설하고, 요점을 말하면

리스트로 구현한 그래프는 정점(vertex)를 삽입, 삭제할 일이 많을 때 사용하면 편하고,

배열로 구현한 그래프는 간선(edge)들만 추가하고 삭제할 때 사용하면 편리하다.

 

먼저, 인접 리스트란 다음과 같이 한 노드의 연결 상태를 연결 리스트로 구현한 것을 의미한다.

각 노드(정점)들의 관계를 찾고 그 노드에 해당하는 연결 리스트를 만드는 것이다.

그래프에는 여러 종류가 존재하지만 두 가지로 요약할 수 있다.

1. 가중치가 없는 그래프

2. 가중치가 있는 그래프

 

가중치가 없는 그래프는 비교적 수월하다.

import java.io.*;
import java.util.ArrayList;

public class Main {

    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 = 4 // 정점의 개수(노드 갯수)
        int m = 5 // 간선의 개수
        
        // 인접 리스트(그래프 전체를 연결하는 배열리스트)
        ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
        
        // 인접 리스트로 구성한 그래프에 ArrayList를 넣어주면서 초기화
        // 여기서의 ArrayList는 각 정점들을 헤드로 두는 리스트
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }
        
        /** 입력 예시
        *   1  2
        *   1  3
        *   1  4
        *   2  4
        *   3  4
        */
        for (int i = 0; i < m; i++) {
            String[] nv = br.readLine().split(" ");
            int n1 = Integer.parseInt(nv[0]);
            int n2 = Integer.parseInt(nv[1]);

            graph.get(n1).add(n2);
            graph.get(n2).add(n1);
        }

        //1번 인접 리스트에서 4번 인접 리스트까지 출력
        for(int i = 1; i <= 4; i++){
        	bw.write(graph.get(i).toString());
        }
        bw.flush();
        bw.close();
    }
}


// 출력 : [2, 3, 4][1, 4][1, 4][1, 2, 3]

 

 

가중치가 있는 그래프는 아래와 같이 Edge 클래스를 선언하여 클래스 내에 가중치를 기억하도록 구현한다.

import java.util.ArrayList;
import java.util.Scanner;

class Edge<W, V> {
    private W weight;
    private V v;

    public void setEdge(W weight, V v) {
        this.weight = weight;
        this.v = v;
    }
}

public class Main {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        int n = 4; // 노드의 갯수
        int m = 5; // 간선의 갯수

        ArrayList<Edge<Integer, Integer>> graph = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            graph.add(new Edge<>());
        }

        for (int i = 0; i < m; i++) { // 간선의 갯수만큼 반복
            int n1 = input.nextInt(); // 노드 1
            int n2 = input.nextInt(); // 노드 2

            int weight = input.nextInt();

            graph.get(n1).setEdge(n2, weight);
            graph.get(n2).setEdge(n1, weight);
        }
    }
}

'Language > JAVA' 카테고리의 다른 글

[JAVA] charAt(i) - '0' 정확한 이유는?  (0) 2022.10.11
[JAVA] 인접 행렬  (0) 2022.08.31
[JAVA] 순열, 중복순열, 조합 총정리  (0) 2022.08.04
[JAVA] Queue 클래스 정리  (0) 2022.07.24
[JAVA] ArrayList 그리고 Vector  (0) 2022.07.23