whitecollar 문제 조언 부탁드립니다.

  • sven
    sven

    WHITECOLLAR

    시작점과 끝점에서 각각 다익스트라를 돌리고 체크하는 방법으로 해결했는데, 제대로 동작하지 않는군요. 경로가 존재한다면 priority queue가 비어있는 경우가 발생하지 않아야 하는데 그런 경우가 발생합니다. 코드에 실수가 있는 것 같은데 잡아내기가 쉽지 않군요. 조언 부탁드립니다.

    #include <memory.h>
    #include <iostream>
    #include <queue>
    #include <cassert>
    
    using namespace std;
    
    class E
    {
    public:
        int to, val;
        E(int a, int b)
        {
            to = a; val = b;
        }
        /*
        bool friend operator < (const E &A, const E &B)
        {
            return A.val > B.val;
        }
         */
    };
    
    bool operator > (const E &A, const E &B)
    {
        return A.val > B.val;
    }
    
    void solve();
    vector <int> dijkstra(vector <vector <E> > A, int head, int target);
    int N, M;
    
    int main()
    {
        int T;
        cin >> T;
        while(T--)
            solve();
    }
    
    void solve()
    {
        vector <vector <E> > A;
        vector <vector <E> > B;
        cin >> N >> M;
        A.resize(N);
        B.resize(N);
        for(int i=0; i<M; i++)
        {
            int temp[2];
            cin >> temp[0] >> temp[1];
            A[temp[0]-1].push_back(E(temp[1]-1,1));
            B[temp[1]-1].push_back(E(temp[0]-1,1));
        }
        vector <int> AA = dijkstra(A,0,N-1);
        vector <int> BB = dijkstra(B,N-1,0);
        assert(AA[N-1] == BB[0]);
        for(int i=0; i<N; i++)
            if(AA[i] + BB[i] == AA[N-1])
                cout << i+1 << " ";
        cout << endl;
    }
    
    vector <int> dijkstra(vector <vector <E> >A, int head, int target)
    {
        vector <int> result;
        result.resize(N);
        for(int i=0; i<N; i++)
            result[i] = -1;
        priority_queue<E, deque<E>, greater<deque<E>::value_type> > C;
        int count = 0;
        result[head] = 0;
        while(count++ < N-1)
        {
            for(int i=0; i<A[head].size(); i++)
                C.push(E(A[head][i].to, 1 +result[head]));
            while(result[C.top().to] != -1)
            {
                C.pop();
                assert(!C.empty()); //here
            }
            head = C.top().to;
            result[head] = C.top().val;
            C.pop();
        }
        return result;
    }
    

    12년 전
2개의 댓글이 있습니다.
  • Being
    Being

    1번과 N번이 아닌 다른 도시가 1번 또는 N번에서 반드시 도달 가능하다는 보장이 문제에 없는 것 같습니다.


    12년 전 link
  • sven
    sven

    아! 감사합니다.


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