ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DFS를 이용한 위상정렬
    Algorithm/그래프 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

    'Algorithm > 그래프' 카테고리의 다른 글

    Dinic's Algorithm  (0) 2020.02.24
    이분 매칭 문제를 해결하는 증가 경로 알고리즘  (0) 2020.02.23
    Ford-Fulkerson algorithm  (0) 2020.02.10
    Prim's MST algorithm  (0) 2020.01.31
    Kruskal's MST algorithm  (0) 2020.01.30

    댓글

Designed by Tistory.