(연결된 정점을 x-x 로 표현하겠다)
i-j-k 가 가능한 i-k 가 있다면 i-k 인 간선은 필요가 없다. 왜냐하면 i-k 는 i-j, j-k 로 표현이 가능하고, 같은 거리로 더 많은 도시를 갈 수 있도록 유지되기 때문이다.
결과적으로 필요한 간선만 남게 된다.
불가능한 경우는 잘못된 입력이 주어지는 경우이다. 이를테면 주어진 입력으로 a->b->c 를 해보면 a->c 보다 더 작게 나온다던가 그런 입력.
#include <cstdio> #include <cstring> int main(){ int i, j, k, n; int v[21][21]={}; scanf("%d", &n); for(i=0; i<n; ++i){ for(j=0; j<n; ++j) scanf("%d", &v[i][j]); } bool destroy[21][21]={}; for(k=0; k<n; ++k){ for(i=0; i<n; ++i){ for(j=0; j<n; ++j){ if(v[i][k]+v[k][j] < v[i][j]){ return puts("-1"), 0; } if(i==j || j==k || i==k) continue; if(v[i][k]+v[k][j] == v[i][j]){ destroy[i][j] = true; } } } } int ans = 0; for(i=0; i<n; ++i){ for(j=i; j<n; ++j){ if(!destroy[i][j]) ans += v[i][j]; } } printf("%d", ans); return 0; }
댓글 없음:
댓글 쓰기