본문 바로가기
자료구조

그래프 표현 (인접 리스트 / 인접 행렬)

by 까망 하르방 2021. 2. 25.
반응형

정점 u - v 간 간선 여부 확인

- 인접 리스트는 adList[u]의 처음부터 읽어나가면서 각 원소를 일일이 확인

- 인접 행렬은은 정점 u, v가 주어졌을 때, 단 한 번의 배열의 접근으로 연결 여부 확인

 

공간 복잡도

- 인접행렬: V × V 개수 만큼 공간 필요

- 인접리스트: 정점 개수 V와 실제 간선의 개수 E에 좌우 (V + E)

                    (만약 간선의 개수가 V에 수렵한다면 인접행렬 비슷한 공간복잡도를 가짐)

 

결론

- 간선의 수가 V2에 비해 훨씬 적은 그래프를 희소 그래프 → 인접 리스트

- 간선의 수가 V2에 비례하는 그래프를 밀접 그래프 → 인접 행렬

 

방향성 그래프 (인접 리스트)

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
         
         
        // vertex의 개수
        int vCnt = Integer.parseInt(sc.next());
        // edge의 개수
        int eCnt = Integer.parseInt(sc.next());
         
         
         
        ArrayList<ArrayList<Integer>> adList = new ArrayList<>();
        // 리스트 인덱스 '1'로 하기에 dummy data로 한 개 넣어둠
        adList.add(new<Integer> ArrayList());
        for(int i=0; i<vCnt; i++) {
            adList.add(new<Integer> ArrayList());
        }
         
        for(int i=0;i<eCnt;i++) {
            int v1 = sc.nextInt();
            int v2 = sc.nextInt();
             
            adList.get(v1).add(v2);
        }
         
        //인접리스트 출력
        for(int i=1; i<=vCnt; i++) {
            Iterator<Integer> iter = adList.get(i).iterator();
            System.out.print("[" + i + "]: ");
             
            while(iter.hasNext()) {
                System.out.print(iter.next() + " ");
            }
            System.out.println();
        }
    }
}

 

비방향성 그래프 (인접 리스트)

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
         
         
        // vertex의 개수
        int vCnt = Integer.parseInt(sc.next());
        // edge의 개수
        int eCnt = Integer.parseInt(sc.next());
         
         
         
        ArrayList<ArrayList<Integer>> adList = new ArrayList<>();
        // 리스트 인덱스 '1'로 하기에 dummy data로 한 개 넣어둠
        adList.add(new<Integer> ArrayList());
        for(int i=0; i<vCnt; i++) {
            adList.add(new<Integer> ArrayList());
        }
         
        for(int i=0;i<eCnt;i++) {
            int v1 = sc.nextInt();
            int v2 = sc.nextInt();
             
            // 비방향 그래프이기 때문에 양쪽에 edge가 있다는것을 구현해야 한다.
            adList.get(v1).add(v2);
            adList.get(v2).add(v1);
        }
         
        //인접리스트 출력
        for(int i=1; i<=vCnt; i++) {
            Iterator<Integer> iter = adList.get(i).iterator();
            System.out.print("[" + i + "]: ");
             
            while(iter.hasNext()) {
                System.out.print(iter.next() + " ");
            }
            System.out.println();
        }
    }
}

 

방향성 그래프 (인접 행렬)

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
         
        // vertex의 개수
        int vCnt = Integer.parseInt(sc.next());
        // edge의 개수
        int eCnt = Integer.parseInt(sc.next());
        // 리스트 인덱스 '1'로 하기에 크기를 1개 늘려서 할당
        int[][] adMatrix = new int[vCnt+1][vCnt+1];
         
        for(int i=0;i<eCnt;i++) {
            int v1 = sc.nextInt();
            int v2 = sc.nextInt();
            adMatrix[v1][v2] = 1;
        }
         
        for(int i=1; i<=vCnt; i++) {
            System.out.print("[" + i + "]: ");
            for(int j=1; j<=vCnt; j++) {
                System.out.print(adMatrix[i][j]+ " ");
            }
            System.out.println();
        }
    }
}

 

비방향성 그래프 (인접 행렬)

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
         
        // vertex의 개수
        int vCnt = Integer.parseInt(sc.next());
        // edge의 개수
        int eCnt = Integer.parseInt(sc.next());
        // 리스트 인덱스 '1'로 하기에 크기를 1개 늘려서 할당
        int[][] adMatrix = new int[vCnt+1][vCnt+1];
         
        for(int i=0;i<eCnt;i++) {
            int v1 = sc.nextInt();
            int v2 = sc.nextInt();
            adMatrix[v1][v2] = 1;
            adMatrix[v2][v1] = 1;
        }
         
        for(int i=1; i<=vCnt; i++) {
            for(int j=1; j<=vCnt; j++) {
                System.out.print(adMatrix[j][i]+ " ");
            }
            System.out.println();
        }
    }
}

 

 

반응형

'자료구조' 카테고리의 다른 글

[스택] Stack 이란?  (0) 2021.04.22
우선순위 큐 (Priority Queue)  (0) 2021.03.21
힙(Heap) 시뮬레이션  (0) 2021.02.27
힙(Heap) 자료구조란?  (0) 2021.02.27
그래프 정의 및 구현 방식 (인접 행렬 & 인접 리스트)  (0) 2021.02.25

댓글