[알고리즘] 위상정렬 코드 (topological sort) for DAG (Directed acyclic graph)
Directed graph에서 어떤 dependency에 의한 순서를 갖고 순회해야 하는 graph가 존재할 경우 topological sort를 사용한다.
void graph_topological_sort(item_t *items, uint32 n, uint32 start_idx) { uint32 i, j, k, pos; queue<long> que; adj_node_t *adj_node; list_node_t *node;
int *indegree = new int[n];
for (i = 0; i < n; i++) indegree[i] = 0;
for (i = 0; i < n; i++) { if (RET_TYPE_FAILURE == items[i].adj_list->get_head_position(items[i].adj_list, &pos)) continue;
while (1) { node = items[i].adj_list->get_next(items[i].adj_list, &pos); if (NULL == node) break; adj_node = (adj_node_t *)node->data; k = item_find_slot(items, adj_node->vertex->name, n); indegree[k]++; } }
for (i = 0; i < n; i++) { if (0 == indegree[i]) que.push(i); }
for (i = 0; i < n && !que.empty(); i++) { j = que.front(); que.pop(); LOGD("%s -> ", items[j].vertex.name);
if (RET_TYPE_FAILURE == items[j].adj_list->get_head_position(items[j].adj_list, &pos)) continue;
while (1) { node = items[j].adj_list->get_next(items[j].adj_list, &pos); if (NULL == node) break;
adj_node = (adj_node_t *)node->data; k = item_find_slot(items, adj_node->vertex->name, n); indegree[k]--; if (0 == indegree[k]) que.push(k); } }
delete []indegree; } |
'Algorithms' 카테고리의 다른 글
Softeer: H-클린알파 (0) | 2021.12.22 |
---|---|
Softeer: 징검다리2 (0) | 2021.12.22 |
[알고리즘] 미로 최단 경로 찾기 (finding the shortest path in a maze) (0) | 2018.03.18 |
[알고리즘] graph cycle 여부 판단 알고리즘 (undirected 용) (0) | 2015.07.05 |
[알고리즘] 개미집 찾기 문제 (한 node가 다른 node 의 탐색 경로 내 존재 여부 찾기) (0) | 2015.07.04 |
댓글