article thumbnail image
Published 2022. 1. 18. 13:37

문제 설명

문제 링크

http://icpc.me/1865

 

1865번: 웜홀

첫 번째 줄에는 테스트케이스의 개수 TC(1 ≤ TC ≤ 5)가 주어진다. 그리고 두 번째 줄부터 TC개의 테스트케이스가 차례로 주어지는데 각 테스트케이스의 첫 번째 줄에는 지점의 수 N(1 ≤ N ≤ 500),

www.acmicpc.net

풀이

플로이드 와샬을 이용하면 O(N^3)에 풀 수 있다.

플로이드 와샬을 돌린 후 dp[i][i]에 음수가 있는지 체크하면 된다.

코드

 

#include <bits/stdc++.h>
using namespace std;

const int N = 502;
const int INF = 1e8;
int dp[N][N];

int main() {
    int tc; scanf("%d", &tc);
    while (tc--) {
        int n, m, w; scanf("%d %d %d", &n, &m, &w);
        for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) dp[i][j] = INF;

        while (m--) {
            int s, e, t; scanf("%d %d %d", &s, &e, &t);
            dp[s][e] = min(dp[s][e], t);
            dp[e][s] = min(dp[e][s], t);
        }
        while (w--) {
            int s, e, t; scanf("%d %d %d", &s, &e, &t);
            dp[s][e] = -t;            
        }

        for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) {
            dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);            
        }
        bool flag = false;
        for (int i = 1; i <= n; i++) if (dp[i][i] < 0) flag = true;
        printf("%s\n", flag ? "YES" : "NO");
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

백준[14942] 개미  (0) 2022.01.19
백준[13549] 숨바꼭질 3  (0) 2022.01.18
백준[7662] 이중 우선순위 큐  (0) 2022.01.14
백준[1238] 파티  (0) 2022.01.11
백준[1562] 계단 수  (0) 2022.01.09
복사했습니다!