[백준/Baekjoon] 1729 골목길 C++ :: Bellman-Ford

2023. 9. 3. 13:07· Algorithm/Beakjoon
목차
  1. 1. Logic
  2. 2. Code
  3. 3. Feedback
728x90
반응형

https://www.acmicpc.net/problem/1738

 

1738번: 골목길

첫째 줄에 골목길들이 교차하는 지점의 개수 n (2 ≤ n ≤ 100)과 골목길의 개수 m (1 ≤ m ≤ 20,000) 이 차례로 주어진다. 이어지는 m개의 행에 각각의 골목길을 나타내는 세 정수 u, v, w가 차례로 주어

www.acmicpc.net


1. Logic

1. 최적경로 즉 시작부터 목적지까지 최단거리로 가는 경우가 있는지를 먼저 파악하기 위해 BFS통해 최단거리를 확인해놓는다.

2. 벨만포드를 돌면서 최단경로를 확인하고 v번을 돌면서 마지막 사이클에서 음의 사이클을 확인한다.

3. 벨만 포드 알고리즘을 돌면서 최단경로를 갱신할 때에만 

 

주의 해야 할 사항

음의 사이클이 있다고 무조건 -1을 반환하는게 아니라 내가 가는 경로에 음의 사이클이 있으면 -1을 반환하는 것.

음의 사이클이 있어도 내가 가는 경로에 해당되지 않는다면 상관 없음


2. Code

#include <bits/stdc++.h>
using namespace std;
int n, m;
const int INF = 0x3f3f3f3f;
vector<pair<int, int>> adj[101]; //벨만-포드 돌기위해 정보 저장
vector<int> rev_adj[101]; //BFS로 연결되어있는지 확인하기 위해 노드 정보 저장
int dist[101]; //최단거리 저장
int trace[101]; //경로를 확인하기 위해
bool vis[101]; //BFS에서 중복 방지 방문 배열
bool check = false; //음수사이클 체크
void bellman(int start, int end) {
memset(dist, INF, sizeof(dist));
dist[start] = 0;
//V-1번에 한번을 더 돌아서 음의 사이클이 있는지 확인
for (int iter = 0; iter < n; ++iter) {
for (int here = 1; here <= n; ++here) {
//연결되지 않은, 계산되지 않은 최단거리는 건너뛰기
if (dist[here] == INF) continue;
for (auto &a : adj[here]) {
int there = a.first;
int cost = a.second;
if (dist[there] > dist[here] + cost) {
dist[there] = dist[here] + cost;
trace[there] = here;
// V-1번까지 돈 후 마지막 음의 사이클을 돌았는지 확인
if (iter == n - 1 && vis[there])
check = true;
}
}
}
}
}
void BFS() {
queue<int> q;
q.push(n);
vis[n] = true;
while (!q.empty()) {
int cur = q.front();
q.pop();
for (int i = 0; i < rev_adj[cur].size(); i++) {
int next = rev_adj[cur][i];
if (vis[next]) continue;
vis[next] = true;
q.push(next);
}
}
}
int main() {
ios_base::sync_with_stdio(false); cout.tie(0); cin.tie(0);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, -w});
rev_adj[v].push_back(u);
}
BFS();
bellman(1, n);
if (check) {
cout << -1;
} else {
vector<int> tra;
int tr = n;
while (tr >= 1) {
tra.push_back(tr);
tr = trace[tr];
}
for(int i = tra.size() - 1; i >= 0; i--) {
cout << tra[i] << " ";
}
}
}

 

 


3. Feedback

 벨만포드는 최단거리 알고리즘이지만 이 문제에서는 cost값을 넣을 때 -를 붙혀서 넣어주어 최대 거리를 구해주었다. 활용이 필요한 문제여서 접근하는데 어려웠다.

알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐

 

 

728x90
반응형

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

[백준/Baekjoon] 2302 극장 좌석 C++ :: Dynamic Programming  (0) 2023.09.06
[백준/Baekjoon] 20303 할로윈의 양아치 C++ :: DP & BFS  (0) 2023.09.05
[백준/Baekjoon] 1865 웜홀 C++ :: Bellman-Ford  (3) 2023.09.02
[백준/Baekjoon] 14938 서강그라운드 C++ :: Floyd-Warshall  (0) 2023.08.31
[백준/Baekjoon] 11779 최소비용 구하기 2 C++ :: Graph / Dijkstra  (0) 2023.08.29
  1. 1. Logic
  2. 2. Code
  3. 3. Feedback
'Algorithm/Beakjoon' 카테고리의 다른 글
  • [백준/Baekjoon] 2302 극장 좌석 C++ :: Dynamic Programming
  • [백준/Baekjoon] 20303 할로윈의 양아치 C++ :: DP & BFS
  • [백준/Baekjoon] 1865 웜홀 C++ :: Bellman-Ford
  • [백준/Baekjoon] 14938 서강그라운드 C++ :: Floyd-Warshall
보글보글소다
보글보글소다
반응형
보글보글소다
Conquer Mind, Conquer All
보글보글소다
전체
오늘
어제
  • 분류 전체보기
    • Algorithm
      • Beakjoon
      • Programmers
    • Frontend
      • React.js
      • JavaScript
    • Backend
      • Java
      • Spring
      • Node.js
    • Design Pattern
    • Computer Science
      • Algorithm
      • 컴퓨터구조
      • 운영체제
      • 네트워크
      • 데이터베이스
      • 자료구조
    • Projects
      • 식단 짜주는 웹
    • 정보보호병
      • Study In military
      • 정보보호병
    • 인공지능
      • 논문 리뷰

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리
  • 글쓰기

공지사항

인기 글

태그

  • 동적계획법
  • 이분탐색
  • 운영체제
  • spring
  • 그래프
  • Programmers
  • Algorithm
  • 코딩테스트
  • 프로그래머스
  • 백준 풀이
  • 백엔드
  • BaekJoon
  • 구현
  • DP
  • 자료구조
  • 알고리즘 풀이
  • BFS
  • 스프링
  • 알고리즘
  • 백준

최근 댓글

최근 글

250x250
hELLO · Designed By 정상우.v4.2.2
보글보글소다
[백준/Baekjoon] 1729 골목길 C++ :: Bellman-Ford
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.