smooth waters run deep

공부내용/알고리즘

그래프 - 인접행렬/인접리스트

yeon_11 2020. 12. 3. 15:23

그래프 표현 - ① 인접행렬

 

인접행렬 (무방향그래프, 가중치 1일 때)

 

- 정점 두 개의 관계가 v1->v2, v1-v2 와 같이 연결되어 있는 경우(인접해있는 경우) 간선의 가중치를 배열로 표현한다.

 

- 장점 : 구현이 용이하고, v1->v2 의 가중치와 연결 여부를 한 번에 탐색할 수 있다. (v1->v2의 가중치==arr[v1][v2]이므로)

 

- 단점 : 임의의 정점에 연결된 정점을 알기 위해서 정점의 개수만큼 탐색해야 하고,

              인접관계를 저장하기 위한 배열의 크기가 nXn 만큼 필요하다. -> 간선 개수가 적을 경우 비효율

 

 

 

코드 구현 - ① 인접행렬

/* 입력 예시:
   5 6 (정점 개수, 간선 개수)
   0 1 (정점0 - 정점1 인접)
   0 2
   0 4
   1 3
   2 3
   2 4
*/

public static void main(String[] args) throws Exception {
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st;
    
    st = new StringTokenizer(br.readLine());
    int n = Integer.parseInt(st.nextToken()); //정점 개수
    int m = Integer.parseInt(st.nextToken()); //간선 개수
    
    int[][] graph = new int[n][n];
    
    for(int i=0; i<m; i++){
    	st = new StringTokenizer(br.readLine());
        int v1 = Integer.parseInt(st.nextToken());
        int v2 = Integer.parseInt(st.nextToken());
        graph[v1][v2] = graph[v2][v1] = 1;
    }
	
    br.close();
}    

 

 

 

 

그래프 표현 - ② 인접리스트

 

인접리스트 (무방향그래프, 가중치 1일 때)

 

- 정점 두 개의 관계가 v1->v2, v1-v2 와 같이 연결되어 있는 경우(인접해있는 경우) 간선의 가중치를 리스트로 표현한다.

   : LinkedList, ArrayList 이용

 

- 장점 : 간선의 개수가 적은 경우 효율적이고(메모리 절약 가능), 임의의 정점과 연결된/인접한 정점 탐색에 유용하다.

              정점 추가/삭제 가 쉽고 빠르다. 

 

- 단점 : 정점 간 연결 관계를 파악하기 위해서는 연결된 정점을 모두 거치는 탐색 과정이 필요하다.

 

 

 

코드 구현 - ② 인접리스트

/* 입력 예시:
   5 6 (정점 개수, 간선 개수)
   0 1 (정점0 - 정점1 인접)
   0 2
   0 4
   1 3
   2 3
   2 4
*/

public static void main(String[] args) throws Exception {
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st;
    
    st = new StringTokenizer(br.readLine());
    int n = Integer.parseInt(st.nextToken()); //정점 개수
    int m = Integer.parseInt(st.nextToken()); //간선 개수
    
    ArrayList<Integer>[] graph = new ArrayList[n];
    for(int i=0; i<n; i++){
    	graph[i] = new ArrayList<>();
    }
    
    for(int i=0; i<m; i++){
    	st = new StringTokenizer(br.readLine());
        int v1 = Integer.parseInt(st.nextToken());
        int v2 = Integer.parseInt(st.nextToken());
        graph[v1].add(v2);
        graph[v2].add(v1);
    }
	
    br.close();
}    

 

'공부내용 > 알고리즘' 카테고리의 다른 글

N-Queens Problem (BOJ_9663)  (2) 2020.12.05
외판원 순회 문제 (TSP) (BOJ_2098)  (0) 2020.11.29
플로이드-와샬 알고리즘 (Floyd's Algorithm)  (0) 2020.11.26
최대공약수 & 최소공배수  (0) 2020.11.22
조합 nCr  (0) 2020.11.11