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

  • User Avatar
    sancho

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

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


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

    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;
    }

    </spoiler>
    

    11년 전
2개의 댓글이 있습니다.
  • User Avatar
    JongMan

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


    11년 전 link
  • User Avatar
    sancho

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


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