반응형
이번 문제는 전형적인 플로이드 워샬 문제입니다.
플로이드 워샬 알고리즘은 음의 가중치가 있어도 문제를 풀 수 있고, 사이클을 찾아내는데에도 유용합니다. 하지만, 반복횟수가 많기 때문에, 노드의 개수가 많은 경우에는 좋지 않습니다. 알고리즘 시간복잡도가 \(O(V^3)\)입니다.
별도의 자료구조가 필요한 것도 아니기 때문에, 알고리즘만 이해하고 있다면, 손쉽게 구현할 수 있습니다.
제가 작성한 소스입니다.
//------------------------------------------------
// baekjoon #1956
// - by Aubrey Choi
// - created at 2019-11-16
//------------------------------------------------
#include <stdio.h>
#define INF 1000000000
int main()
{
int v, e, f, t, w, i, j, k, adj[400][400], min=INF;
scanf("%d%d",&v,&e);
for(i=0;i<v;i++) for(j=0;j<v;j++) adj[i][j]=INF;
while(e--) { scanf("%d%d%d",&f,&t,&w); adj[f-1][t-1]=w; }
for(k=0;k<v;k++) for(i=0;i<v;i++) for(j=0;j<v;j++)
{
if(adj[i][j]>adj[i][k]+adj[k][j]) adj[i][j]=adj[i][k]+adj[k][j];
}
for(i=0;i<v;i++) if(adj[i][i]<min) min=adj[i][i];
printf("%d\n",min<INF?min:-1);
}
728x90
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #1965 상자넣기(가장 긴 증가하는 부분수열) (0) | 2022.12.10 |
---|---|
[C/C++] 백준 #1963 소수 경로(너비 우선 탐색) (2) | 2022.12.09 |
[C/C++] 백준 #1946 신입 사원(탐욕 기법) (0) | 2022.11.29 |
[C/C++] 백준 #1940 주몽(두개의 포인터) (0) | 2022.11.29 |
[C/C++] 백준 #1939 중량제한(그래프) (0) | 2022.11.19 |
댓글