Algorithm/그래프

DFS를 이용한 위상정렬

jhg0406 2020. 3. 4. 02:57
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//깊이 우선 탐색을 이용한 위상 정렬
 
vector<int> seen, order;
void dfs(int here)
{
    seen[here] = 1;
    for(int there = 0; there < adj.size(); ++there)
        if(adj[here][there] && !seen[there])
            dfs(there);
    order.push_back(here);
}
//adj에 주어진 그래프를 위상정렬한 결과를 반환한다
//그래프가 DAG가 아니라면 빈 벡터를 반환한다
vector<int> topologicalSort()
{
    int m = adj.size();
    seen = vector<int>(m, 0);
    order.clear();
    for(int i = 0; i<m; ++i)
        if(!seen[i]) dfs(i);
    reverse(order.begin(), order.end());
    //만약 그래프가 DAG가 아니라면 정렬 결과에 역방향 간선이 있다
    //교차 간선은 위의 dfs의 order에 넣는 순서에 의해 무시되고 오직 역방향 간선만이 검출된다
    //교차 간선은 DAG와 아무상관 없지만 역방향 간선은 무조건 DAG임으로 역방향 간선이 있으면 빈 벡터를 반환한다
    for(int i = 0; i<m; ++i)
        for(int j = i+1; j<m; ++j)
            if(adj[order[j]][order[i]])
                return vector<int>();
    return order;
}
cs

 

 

 

 

 

 

시간복잡도

인접행렬 : O(V^2)

(DAG인지 판단하는것 == DFS에 걸리는 시간)

인접리스트 : O(V^2) or O(|V| + |E|)

(DAG인지 판단하는것 or DFS에 걸리는 시간)

 

 

 

 

 

 

종만북2