시작점과 끝점에서 각각 다익스트라를 돌리고 체크하는 방법으로 해결했는데, 제대로 동작하지 않는군요. 경로가 존재한다면 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;
}
sven
[[problem:WHITECOLLAR]]
시작점과 끝점에서 각각 다익스트라를 돌리고 체크하는 방법으로 해결했는데, 제대로 동작하지 않는군요. 경로가 존재한다면 priority queue가 비어있는 경우가 발생하지 않아야 하는데 그런 경우가 발생합니다. 코드에 실수가 있는 것 같은데 잡아내기가 쉽지 않군요. 조언 부탁드립니다.
13년 전