잘못 구현한 디닉
시간 제한2초메모리 제한512 MB
입력이 없고 출력이 정해진 4개 정점, 5개 간선 유량 그래프를 그대로 인쇄하는 문제이다.
문제
항상 플로우 문제를 Edmond-Karp 알고리즘으로 푸는 지구이는 어느 날 정점 500개와 간선 100000개의 플로우 문제를 보게 되었다. 지구이는 열심히 플로우 그래프를 구성하고, 약 2000바이트를 코딩한 후 제출했지만 정답 판정을 받지 못했다. 코드 최적화를 하다가 지친 지구이는 시간복잡도가 최악의 경우 인 Dinic이라는 알고리즘을 찾아냈다.
Dinic 알고리즘은 다음과 같다.
- 유량이 남은 간선을 길이 1짜리 간선으로 생각하고 소스에서 모든 정점까지의 최단거리 를 구한다.
- DFS로 확장 경로를 구해 플로우를 흘린다. 이때 간선 가 인 경우에만 플로우를 흘린다.
- 플로우가 없을 때까지 1과 2를 반복한다.
Dinic의 시간복잡도는 이며, 증명은 다음과 같다.
- 1단계와 2단계는 최대 번 반복된다. 1단계와 2단계를 수행할 때마다 가 최소 1씩 증가하고, 는 를 초과할 수 없다.
- 1단계는 이다. BFS로 계산할 수 있다.
- 2단계는 이다. 한 번 플로우를 흘릴 때마다 최소 한 개의 간선의 유량이 꽉 차기 때문에 확장 경로는 최대 번 만들어진다. 또한 확장 경로의 길이는 최대 이다.
지구이는 열심히 구현했음에도 여전히 정답 판정을 받지 못했다. 도토리는 지구이의 코드를 보고, 확장 경로를 찾을 때 플로우를 흘릴 수 없는 간선들을 매번 처음부터 다시 탐색하는 실수가 있다고 알려 주었다. 지구이는 작은 예제 그래프를 보기 전까지 그 말을 믿지 않는다.
도토리를 도와 그 예제 그래프를 출력하자. 출력할 그래프는 하나뿐이다.
지구이가 푸는 문제는 1번 정점에서 번 정점까지 플로우를 흘리는 문제이다. 간선은 연결 리스트로 저장하며, 리스트의 앞부분에 새 간선을 넣기 때문에 나중에 입력된 간선을 먼저 사용한다.
입력
입력은 없다.
출력
첫 번째 줄에 정점 개수 과 간선 개수 을 출력한다. 은 이고 은 이다.
그다음 개의 줄에 시작 정점 , 끝 정점 , 최대 유량 를 공백으로 구분해 한 줄에 하나씩, 아래 순서대로 출력한다.
- 에서 로 가는 용량
- 에서 으로 가는 용량
- 에서 로 가는 용량
- 에서 로 가는 용량
- 에서 로 가는 용량
그래프에 중복 간선은 없다. 각 줄은 , , 순서로 정수를 출력한다.