일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- 백준
- data structure
- 독서
- db
- 데이터베이스
- cs
- Computer Science
- LeetCode
- 운영체제
- Programmers
- 문제풀이
- D2
- OS
- network
- BOJ
- 프로그래머스
- 알고리즘
- c++
- 자료구조
- 네트워크
- 감상문
- algogritim
- language
- swea
- 법의학
- D3
- SW Expert Academy
- 재테크/투자
- algorithm
- Database
Archives
- Today
- Total
선택은 나의 것
[BOJ 백준] 1865번 웜홀 본문
문제
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;
}
'☽ Algorithm > BOJ' 카테고리의 다른 글
[BOJ 백준] 21608번 상어 초등학교 (0) | 2021.08.18 |
---|---|
[BOJ 백준] 1520번 내리막 길 (0) | 2021.07.26 |
[BOJ 백준] 2671번 잠수함식별 (0) | 2021.07.24 |
[BOJ 백준] 1867번 돌멩이 제거 (0) | 2021.07.23 |
[BOJ 백준] 11375번 열혈강호 (0) | 2021.07.22 |
Comments