선택은 나의 것

[BOJ 백준] 1865번 웜홀 본문

☽ Algorithm/BOJ

[BOJ 백준] 1865번 웜홀

Algoribi 2021. 7. 25. 14:24

문제

BOJ 1865 : https://www.acmicpc.net/problem/1865

 

1865번: 웜홀

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

www.acmicpc.net

접근

 문제에서 웜홀은 결국 음의 값을 가지는 간선이기 때문에 벨만-포드(Bellman-Ford)알고리즘을 사용하여 문제를 해결하였다. 

코드

#include <iostream>
#include <vector>

#define endl "\n"
#define MAX 30000000

using namespace std;

struct eg {
    int s, e, t;
};

int n, m, w;
bool chk(vector<eg> v) {
    vector<int> dist(n + 1, MAX);

    int s, e, t;
    dist[1] = 0;
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < v.size(); j++) {
            s = v[j].s;
            e = v[j].e;
            t = v[j].t;
            if (dist[e] > dist[s] + t)
                dist[e] = dist[s] + t;
        }
    }
    for (int j = 0; j < v.size(); j++) {
        s = v[j].s;
        e = v[j].e;
        t = v[j].t;
        if (dist[e] > dist[s] + t)
            return true;
    }

    return false;
}

int main() {
    int tc;
    cin >> tc;
    for (int i = 0; i < tc; i++) {
        cin >> n >> m >> w;
        int s, e, t;
        vector<eg> v;
        for (int j = 0; j < m; j++) {
            cin >> s >> e >> t;
            v.push_back({s, e, t});
            v.push_back({e, s, t});
        }
        for (int j = 0; j < w; j++) {
            cin >> s >> e >> t;
            v.push_back({s, e, -t});
        }
        if (chk(v))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

 

깃 허브 주소 : https://github.com/algoribi/algorithm-study

Comments