작디작은 PS기록

백준 1865 : 웜홀

wifilion 2024. 3. 9. 17:51

이거 한참 해메고, 또 의미를 해석하는 데에도 시간을 많이 썼다.

이는 벨만 포드 알고리즘의 "거리 계산"에 집중했기 때문으로, 이 문제에서는 그것을 요구하는 것이

아니었다.... 이 문제에서는 결국 "갱신 여부"에 집중하므로, d[i]=INF?라는 조건문을 빼버려야 하며(그러면

애초에 갱신이 안되므로) 더 나아가 애초에 d[i]를 INF로 갱신 안 해도 갱신 여부만을 판단하는 데에는 아무 문제가 없다.

그렇게 질문 계시판을 참조하여 얻은 코드는 다음과 같다:

#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
vector<pair<pair<int, int>, int> > a;
long long int TC, N, M, W, d[501];
bool bellman_ford(void){
	for(int i=1;i<=N;i++){
		for(int j=0;j<a.size();j++){
			int now=a[j].first.first;
			int next=a[j].first.second;
			int cost=a[j].second;
			if(d[next]>d[now]+cost){
				d[next]=d[now]+cost;
				if(i==N){
					return true;
				}
			}
		}
	}
	return false;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> TC;
	for(int r=1;r<=TC;r++){
		cin >> N >> M >> W;
		for(int i=1;i<=M+W;i++){
			int S, E, T;
			cin >> S >> E >> T;
			if(i<=M){
				a.push_back(make_pair(make_pair(E, S), T));
				a.push_back(make_pair(make_pair(S, E), T));
			}
			else{
				a.push_back(make_pair(make_pair(S, E), -T));
			}
		}
		if(bellman_ford()==true) cout << "YES" << '\n';
		else cout << "NO" << '\n';
		while(!a.empty()) a.pop_back();
	}
}

이거 AC 받으려 이상한 짓도 해 봤다. 뭐 cin tie를 푼다든지 뭐.... 결론은 그게 아니었지만.

고정 관념에서 벗어나자는 것이 오늘 "웜홀"의 결론이다.