방향그래프(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
|
'알고리즘(Algorithm) > 그래프(Graph)' 카테고리의 다른 글
[그래프] 그래프에서 사이클 찾는 방법들(Detect Cycle in an Graph) (0) | 2019.07.06 |
---|---|
[그래프] 위상 정렬(Topological Sort) - Kahn's algorithm (0) | 2019.07.04 |
그래프(Graph)-너비우선탐색(BFS, Breadth First Search) algorithm (0) | 2019.07.02 |
그래프(Graph)-깊이우선탐색(DFS, Depth First Search) (0) | 2019.07.02 |
최소신장트리(Minimum Spanning Tree)-크러스컬(Kruskal) 알고리즘 (0) | 2019.07.02 |