지구이는 간선의 가중치가 1 또는 −1인 방향 그래프에 음수 사이클이 있는지 판정하려고 벨만포드 알고리즘을 다음과 같이 구현했다.
- 모든 정점 v에 대하여 d[v]를 0으로 초기화한다.
- 갱신 한 회차는 입력에 주어진 순서대로 모든 간선 (s,e,w)를 훑으면서 d[e]에 min(d[e], d[s]+w)를 대입하는 것이다. 간선 하나를 처리할 때마다 d가 곧바로 바뀌고, 같은 회차의 다음 간선은 바뀐 값을 쓴다.
- 갱신을 N−2회 반복한다. 원래대로라면 N−1회여야 한다.
- 갱신을 한 회차 더 했을 때 d의 값이 하나라도 바뀌면 음수 사이클이 있다고 판정한다.
3번의 반복 횟수를 하나 덜 쓴 탓에, 이 코드는 음수 사이클이 없는 그래프를 보고도 있다고 답한다. 그런 그래프를 직접 만들어서 지구이의 코드가 틀렸음을 보여라.
정점 개수 N이 주어진다. 정점이 N개이고 모든 간선의 가중치가 1 또는 −1인 방향 그래프 중에서, 음수 사이클이 없지만 위 코드가 음수 사이클이 있다고 판정하는 그래프를 하나 출력한다. 간선을 출력하는 순서가 곧 코드가 간선을 훑는 순서이므로, 순서도 답의 일부다.
조건을 만족하는 그래프는 여러 개다. 그중 간선 개수 M이 가장 작은 것을 출력하고, 그런 그래프가 여럿이면 출력한 간선을 순서대로 s1,e1,d1,s2,e2,d2,…,sM,eM,dM처럼 늘어놓아 앞에서부터 수를 비교했을 때 사전순으로 가장 앞서는 것을 출력한다.