ORDERING 오답 케이스를 못찾겠습니다.

  • sancho
    sancho

    ORDERING 문제를 풀고 있습니다.
    간단한 위상정렬 문제라고 생각했는데..
    사전순 배열이 한번 발목을 잡더니..
    예제 케이스는 모두 맞는데 저지에서 오답이 자꾸 나오네요;
    모든 작업을 수행할 수 있다고 가정한다는 것은
    cycle 이 없다고 하는것이라 생각했는데, 그 생각이 틀린건지..

    도움 부탁 드리며.. 미리 감사드립니다.

    사전순 배열을 위해 간선이 존재하는 노드를 찾는 반복문이
    A가 아닌 Z부터 찾기 시작하는 것 빼고는 일반적인 위상정렬입니다.

    #include <iostream>
    
    using namespace std;
    
    int N;
    int M;
    int ADJ[26][26];
    bool VISITED[26];
    int ORDER[26];
    int COUNT;
    
    void dfs(int here)
    {
        VISITED[here] = true;
        for (int there = N - 1; there >= 0; there--) {
            if (ADJ[here][there] && !VISITED[there]) {
                dfs(there);
            }
        }
        ORDER[COUNT++] = here;
    }
    
    void makeGraph()
    {
        for (int i = 0; i < M; i++) {
            char first, second;
            if (N == 1) {
                cin >> first;
                second = first;
            } else {
                cin >> first >> second;
            }
            ADJ[first - 'A'][second - 'A'] = 1;
        }
    }
    
    void dfsAll()
    {
        for (int i = N - 1; i >= 0; i--) {
            if (!VISITED[i])
                dfs(i);
        }
    }
    
    void init()
    {
        COUNT = 0;
        for (int i = 0; i < 26; i++)
            for (int j = 0; j < 26; j++)
                ADJ[i][j] = 0;
        for (int i = 0; i < 26; i++) {
            VISITED[i] = false;
            ORDER[i] = -1;
        }
    }
    
    int main(int c, char **v)
    {
        ios_base::sync_with_stdio();
        int C;
        cin >> C;
        while (C--) {
            cin >> N >> M;
            init();
            makeGraph();
            dfsAll();
            for (int i = COUNT - 1; i >= 0; i--)
                cout << (char)(ORDER[i] + 'A');
            cout << endl;
        }
        return 0;
    }
    


    9년 전
2개의 댓글이 있습니다.
  • JongMan
    JongMan

    사전순 출력에서 막히시는 것 같은데요. dfs 쓰는 위상정렬로는 어려울 것 같아요.


    9년 전 link
  • sancho
    sancho

    감사합니다.
    종만님 덕분에 해결했네요.
    계속 dfs 에 매달렸으면 못풀었을지도...


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.