whitecollar 문제 조언 부탁드립니다. 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 1번과 N번이 아닌 다른 도시가 1번 또는 N번에서 반드시 도달 가능하다는 보장이 문제에 없는 것 같습니다. 12년 전 link sven 아! 감사합니다. 12년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
sven
WHITECOLLAR
시작점과 끝점에서 각각 다익스트라를 돌리고 체크하는 방법으로 해결했는데, 제대로 동작하지 않는군요. 경로가 존재한다면 priority queue가 비어있는 경우가 발생하지 않아야 하는데 그런 경우가 발생합니다. 코드에 실수가 있는 것 같은데 잡아내기가 쉽지 않군요. 조언 부탁드립니다.
12년 전