Skip to main content

Bellman_Ford

BOJ 1865 μ›œν™€

·486 words·3 mins
πŸ“ 문제 정보 # 링크: https://www.acmicpc.net/problem/1865 🧐 κ΄€μ°° 및 μ ‘κ·Ό # 무ν–₯인 λ„λ‘œμ™€ 유ν–₯인 μ›œν™€μ΄ 있고, 음수 사이클이 μžˆλŠ”μ§€λ₯Ό μ²΄ν¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€. $N \leq 500$으둜 크지 μ•ŠμœΌλ―€λ‘œ, ν”Œλ‘œμ΄λ“œ μ›Œμ…œλ„ μΆ©λΆ„νžˆ λˆλ‹€. 이건 $O(N^3)$ ν•˜μ§€λ§Œ λ²¨λ§Œν¬λ“œλ‘œ $O(VE)$둜 더 λΉ λ₯΄κ²Œλ„ ν’€ 수 μžˆλ‹€. λ²¨λ§Œν¬λ“œκ°€ λœλ‹€λŠ”κ±΄ SPFAλ‘œλ„ 더 λΉ λ₯΄κ²Œ ν’€ 수 μžˆλ‹€! λ‹€ ν•΄λ³Έ κ²°κ³Ό, ν”Œλ‘œμ΄λ“œμ›Œμ…œμ΄ 496ms, λ²¨λ§Œν¬λ“œκ°€ 24ms, SPFAκ°€ 12msκ°€ λ‚˜μ™”λ‹€. πŸ’» 풀이 # μ½”λ“œ (C++): void solve(){ int N, M, W; cin >> N >> M >> W; vector<vector<ll>> cost(N, vector<ll>(N, 1e15)); rep(i, 0, N) cost[i][i] = 0; rep(i, 0, M){ ll u, v, w; cin >> u >> v >> w; u--; v--; cost[u][v] = min(cost[u][v], w); cost[v][u] = min(cost[v][u], w); } rep(i, 0, W){ ll u, v, w; cin >> u >> v >> w; u--; v--; cost[u][v] = min(cost[u][v], -w); } rep(k, 0, N) rep(i, 0, N) rep(j, 0, N) cost[i][j] = min(cost[i][j], cost[i][k] + cost[k][j]); rep(i, 0, N) if(cost[i][i] < 0){ cout << "YES\n"; return; } cout << "NO\n"; } πŸ”’ κ΅¬ν˜„ μ½”λ“œ 잠금