(C++) 백준 11404 플로이드
문제 및 풀이
https://www.acmicpc.net/problem/11404
제목처럼 플로이드 와샬 문제 ~
전체 노드의 최단 거리를 찾을때 효율적이다.
a 노드에서 b 노드로 갈때 또 다른 c 노드를 경유해서 가는 경우도 찾아 최소값으로 갱신한다. (a→b
vs a→c→b
)
전체 배열을 3중 for문으로 돌면서 (i-y 위치, j-x 위치, k-경유 노드) 계산하면 된다.
for(int k=1; k<=n; k++){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(arr[i][k]+arr[k][j]<arr[i][j])
arr[i][j] = arr[i][k] + arr[k][j];
}
}
}
코드
#include <iostream>
using namespace std;
const int INF =10000001;
int n,m;
int a,b,c;
int arr[105][105];
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) {
if(i==j) continue;
arr[i][j]=INF;
}
for(int i=0; i<m; i++){
cin>>a>>b>>c;
arr[a][b]= min(arr[a][b],c);
}
for(int k=1; k<=n; k++){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(arr[i][k]+arr[k][j]<arr[i][j])
arr[i][j] = arr[i][k] + arr[k][j];
}
}
}
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(i==j || arr[i][j]>= INF) cout<<"0 ";
else
cout<<arr[i][j]<<" ";
}
cout<<'\n';
}
}
Author And Source
이 문제에 관하여((C++) 백준 11404 플로이드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@minayeah/11404저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)