할 일 순서 정하기 ORDERING 오답이 계속 떠요..

  • boytoman
    boytoman

    안녕하세요

    topological sorting(위상정렬)
    문제인거는 알겠는데요..

    제 알고리즘이 계속 오답으로 나오네요... 도저히 모르겠습니다.
    예제는 다 맞게 나오는데...

    무엇이 잘못되었는지 아니면 어려운 예제가 있는지 아시는분 부탁드립니다.

    #define SIZE 27
    #define CONNECTSIZE 101
    int TC;
    int N;
    int M;
    char Input[SIZE][2] = { 0, };
    int Data[SIZE][CONNECTSIZE] = { 0, };
    int DataOut[SIZE] = { 0, };
    int DataIn[SIZE] = { 0, };
    int Que[SIZE];
    int Header = 0, Tail = 0;
    
    
    void PRINT_DATA()
    {
        for (int i = 0; i < N; i++)
        {
            printf("%3d", DataOut[i]);
        }
        printf("\n");
        for (int i = 0; i < N; i++)
        {
            printf("%3d", DataIn[i]);
        }
        printf("\n");
    
    }
    
    void PRINT_QUE()
    {
        //printf("[QUE] ");
        for (int i = 0; i < Tail; i++)
        {
            printf("%c", Que[i]+65);
        }
        printf("\n");
    }
    
    void Clean()
    {
        Header = 0;
        Tail = 0;
        for (int i = 0; i < N; i++)
        {
            DataOut[i] = 0;
            DataIn[i] = 0;
            Que[i] = 0;
        }
    }
    
    void AddQue(int Value)
    {
        int Temp;
        Que[Tail++] = Value;
        //PRINT_QUE();
        for (int i = Header + 1; i < Tail; i++)
        {
            int j = i;
            while (j>Header + 1 && Que[j - 1] > Que[j])
            {
                Temp = Que[j-1];
                Que[j - 1] = Que[j];
                Que[j] = Temp;
                j--;
            }
    
        }
        //PRINT_QUE();
    
    }
    void Solved()
    {
        for (int i = 0; i < N; i++)
        {
            if (DataIn[i] == 0)
            {
                Que[Tail++] = i;
            }
    
        }
        //PRINT_QUE();
    
        while (Header != Tail)
        {
            for (int i = 0; i < DataOut[Que[Header]]; i++)
            {
                DataIn[Data[Que[Header]][i]]--;
                if (DataIn[Data[Que[Header]][i]] == 0)
                {
                    AddQue(Data[Que[Header]][i]);
                    //printf("Add Que\n");
                    //PRINT_QUE();
                }
            }
            Header++;
            //printf("Header:%d,Tail:%d\n", Header, Tail);
            //PRINT_QUE();
        }
    
    }
    int main(void)
    {
        scanf("%d", &TC);
    
        for (int i = 0; i < TC; i++)
        {
            scanf("%d %d", &N, &M);
            Clean();
            for (int j = 0; j < M; j++)
            {
                scanf("%s", &Input[j]);
                Data[Input[j][0] - 'A'][DataOut[Input[j][0] - 'A']++] = Input[j][1] - 'A';
                DataIn[Input[j][1] - 'A']++;
            }
    
            if (M == 0)
            {
                for (int k = 65; k < 65 + N; k++)
                {
                    printf("%c", k);
                }
                printf("\n");
            }
            else if (N == 1)
            {
                printf("A\n");
            }
            else
            {
                Solved();
                PRINT_QUE();
            }
        }
    //  PRINT_DATA();
        //printf("%d,%d\n", Data[0][0], Input[0][1]);
    
    
        return 0;
    }
    

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