[알고리즘] 위상정렬 코드 (topological sort) for DAG (Directed acyclic graph)
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' 카테고리의 다른 글
[알고리즘] 도달 가능 모든 경로의 종류 찾아내는 알고리즘 (0) | 2015.07.04 |
---|---|
[알고리즘] critical activity path 찾기 (임계 작업 찾기) (0) | 2015.06.07 |
[알고리즘] 입력 string이 다른 입력 string의 rotation인지를 단 한번의 sub string method를 호출해서 찾기 (0) | 2015.04.05 |
problem A. Speaking in Tongues (0) | 2015.04.03 |
[알고리즘] 하노이의 탑 (0) | 2015.03.15 |
댓글