TaBo
개척하는 기록
TaBo
전체 방문자
오늘
어제
  • 기록들 (63)
    • Programming (35)
      • Java (19)
      • Servlet&Jsp (4)
      • Spring (4)
      • SpringBoot (1)
      • 기타 (2)
      • BOJ (5)
    • CS (16)
      • 자료구조 (4)
      • 알고리즘 (4)
      • 운영체제 (5)
      • 기본 용어 (3)
    • Project (4)
      • [Spring] 게시판 (4)
    • 나에 대한 기록 (8)

블로그 메뉴

  • Github

인기 글

태그

  • 운영체제
  • 자바
  • 알고리즘
  • spring
  • java
  • c++
  • Spring 게시판
  • 스프링 게시판
  • OS
  • 백준

최근 글

티스토리

hELLO · Designed By 정상우.
TaBo

개척하는 기록

[Java] 그래프 표현하기 - 인접 리스트
Programming/Java

[Java] 그래프 표현하기 - 인접 리스트

2023. 4. 27. 21:39

※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 반드시 댓글로 알려주세요!

 

[ 1 ] 그래프

그래프란 연결되어 있는 원소간의 관계를 표현하는 자료구조이다. 그래프는 연결할 객체를 나타내는 정점(Vertex)과 정점들을 연결하는 간선(Edge)의 집합으로 구성된다. 그래프는 다음과 같이 정의할 수 있다.

G = (V, E)

 

 


[ 2 ] 인접 리스트로 그래프 표현하기

Java로 그래프를 표현하는 방법에는 대표적으로 세 가지가 있다. 첫 번째는 정수 배열 기반으로 에지 리스트를 나타낼 수 있고, 두 번째로는 2차원 배열을 기반으로 인접 행렬을 나타낼 수도 있다. 

 

주로 사용되는 방법은 ArrayList를 이용해 인접 리스트로 그래프를 표현하는 방법이다.

 

 

(1) 가중치가 없는 무방향 그래프

(단, n은 정점의 개수이며 1~n의 정점이 존재하고, m은 간선의 개수라고 가정하자. s와 e는 간선으로 연결될 정점들이다)

public class Main {

    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());

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

        graph = new ArrayList[n + 1];
        for(int i = 1; i < n+1; i++) {
            graph[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());
            graph[s].add(e);
            graph[e].add(s);
        }
        
    }
    
}

무방향 그래프이기 때문에 graph[s].add(e), graph[e].add(s) 처럼 양방향 관계로 각 정점의 관계를 나타내야 한다.

 

 

(2) 가중치가 있는 방향 그래프

class Node {
	int num;
    int weight;
    
    Node(int num, int weight) {
    	this.num;
        this.weight;
    }
}

public class Main {

    static ArrayList<Node>[] graph;

    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());

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

        for(int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());
            graph[s].add(new Node(e, w));
        }
        
    }
    
}

무방향이며 가중치가 없는 그래프와 달리 방향 그래프이기에 s → e 방향으로만 정점 간의 관계를 나타내면 되고, 가중치를 저장해야 하기에 Node 클래스를 따로 정의해야 한다.

 

Node 클래스의 필드에는 간선이 가리키는 e 노드와 해당 간선의 가중치 w 가 있다.

 

 

 

저작자표시 비영리 변경금지 (새창열림)

'Programming > Java' 카테고리의 다른 글

[Java] Set Interface - HashSet  (1) 2023.03.06
[Java] 스택(Stack)과, 큐(Queue)  (3) 2023.02.28
[Java] JVM의 메모리 구조(Runtime Data Area)  (0) 2023.02.22
[Java] 클래스, 객체, 인스턴스의 차이 및 객체 배열  (0) 2023.02.17
[Java] JVM, Java 환경변수 설정(Mac, 기본 zsh 쉘)  (5) 2023.01.18
    'Programming/Java' 카테고리의 다른 글
    • [Java] Set Interface - HashSet
    • [Java] 스택(Stack)과, 큐(Queue)
    • [Java] JVM의 메모리 구조(Runtime Data Area)
    • [Java] 클래스, 객체, 인스턴스의 차이 및 객체 배열
    TaBo
    TaBo

    티스토리툴바