본문 바로가기

알고리즘(Algorithm)/그래프(Graph)

[그래프] 모든 정점의 indegree 계산

방향그래프(Directed Graph) 구현에서 보다시피 모든 정점의 indegree 를 계산하는 방법은 에지가 추가될 때마다 미리 계산되어질수 있다.

예를들어 v -> w 에지가 추가된다면 w 인덱스에  indegree 의 카운트를 하나 증가 (14번 라인) 시키면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// indegree[v] 는 정점 V의 incoming edge = indegree의 개수를 저장한다.
private int[] indegree;
 
...
 
public void addEdge(int v, int w) {
        validateVertex(v);
        validateVertex(w);
 
        // 무방향 그래프이니 역뱡향도 추가하였는데 방향그래프에서는 명확히 v -> w로 가는 에지만 추가한다.
        adj.get(v).add(w);
 
        // 그리고 v -> w 이므로 w 의 indegree를 +1 해준다.
        indegree[w]++;
 
        // 그래프내 에지의 총 개수도 +1 해준다.
        E++;
    }
 
Colored by Color Scripter

만약 미리 계산하지 않고 직접 계산한다면 인접리스트에서는 각 정점 v ∈ V 과 연결되 연결리스트들의 w ∈ W 를 조사하여

indegree[w]++ 해주면 각 정점에 들어오는 edge 의 카운트(degree)를 계산할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 정점 집합을 표현하는 하나의 배열과 각 정점마다 인접한 정점들(edge)을 연결하기위한 자료구조.
private ArrayList<LinkedList<Integer>> adj;
 
// 방향그래프내 노드의 총 개수
private final int V;
 
.... 
  
public int[] indegrees() {
        int []indegree = new int[V];
        for(LinkedList<Integer> v : adj) {
            for(Integer w : v) {
                indegree[w]++;
            }
        }
        return indegree;
    }
Colored by Color Scripter