만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

플로이드에 오타가?

면접 대비

시간 제한2초메모리 제한512 MB

요약
플로이드 알고리즘에서 바깥 루프가 정점 N을 경유점으로 사용하지 않을 때, 두 버전의 최단 거리 값이 달라지는 순서쌍의 개수를 센다.
난이도

보통10점 중 6점

유형
최단 경로, 동적 계획법, 그래프
정답자
아직 제출이 없습니다

문제

코딩 실력이 부족하다고 느끼던 지구이는 익명게시판에서 "백스페이스 키를 쓰지 않고 코딩하기를 추천합니다"라는 글을 읽었다. 글 맨 아래에는 효과를 보장할 수 없다는 내용이 아주 작은 글씨로 다섯 줄에 걸쳐 적혀 있었지만, 지구이는 한 번쯤 해 볼 만하다고 생각해 그대로 따라 했다.

지구이가 처음 도전한 문제는 정점이 NN개인 그래프의 인접행렬 DD가 주어질 때 모든 쌍의 최단거리를 구하는 것이었다. 지구이는 플로이드 알고리즘으로 풀려고 했지만 삼중 반복문의 첫 줄에서 오타를 냈다.

for (int k = 1; k < N; k++)
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            D[i][j] = min(D[i][j], D[i][k] + D[k][j]);

바깥 반복문의 조건이 k <= N이 아니라 k < N이어서 정점 NN은 경유지로 한 번도 쓰이지 않는다. 백스페이스를 누르지 않기로 한 지구이는 이 오타를 지우지 못한 채 코드를 끝까지 썼고, 결국 틀렸다.

문제를 푼 뒤 지구이는 자신의 첫 코드가 얼마나 망가졌는지 확인하려고 한다. 인접행렬 DD가 주어질 때, 오타가 난 코드가 구한 값과 올바른 플로이드가 구한 값이 서로 다른 순서쌍 (i,j)(i, j)의 개수를 구하여라. i=ji = j인 경우도 순서쌍에 포함한다.

두 코드 모두 위의 점화식만으로 값을 갱신한다. 인접행렬에 모든 순서쌍의 값이 들어 있으므로 무한대를 따로 두지 않는다.

입력

첫째 줄에 정점의 개수 NN (1≤N≤1001 \le N \le 100)이 주어진다.

둘째 줄부터 NN개의 줄에 인접행렬 DD가 주어진다. ii번째 줄의 jj번째 수가 D(i,j)D(i, j)이다.

모든 ii에 대해 D(i,i)=0D(i, i) = 0이고, 모든 ii, jj에 대해 0≤D(i,j)≤100000 \le D(i, j) \le 10000이다.

출력

첫째 줄에 두 코드의 결과가 다른 순서쌍 (i,j)(i, j)의 개수를 출력한다.

예제3

  1. 예제 1

    입력
    2
    0 1
    1 0
    
    예상 출력
    0
    
  2. 예제 2

    입력
    3
    0 10000 1
    10000 0 1
    1 1 0
    
    예상 출력
    2
    
  3. 예제 3

    입력
    4
    0 5 10000 1
    10000 0 10000 10000
    10000 2 0 10000
    10000 10000 1 0
    
    예상 출력
    2