간단한 해설
v가 적고, 간선 또한 v*(v-1)개이다에서 사실 플로이드를 염두에 두고 있었으나, 다익스트라로 풀리나 한번 해봤다.
결국 33~36%대에서 시간초과가 나서 플로이드로 풀었다.
플로이드를 구현하는 법은 상당히 간단하다.
for문을 3번 돌리는데 이런 식으로 생각하면 편하다.
for(int k=1;k<=v;++k){ // 거쳐가는 정점
for(int i=1;i<=v;++i){ // 출발 정점
for(int j=1;j<=v;++j){ // 도착 정점
if(graph[i][k]==987654321||graph[k][j]==987654321) continue; // 쓰레기값 여과
graph[i][j]=min(graph[i][j],graph[i][k]+graph[k][j]);
}
}
답
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> graph;
int ans=987654321;
int v,e;
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
cin>>v>>e;
graph.resize(v+1,vector<int>(v+1,987654321));
int a,b,c;
for(int i=0;i<e;++i){
cin>>a>>b>>c;
graph[a][b]=c;
}
for(int k=1;k<=v;++k){
for(int i=1;i<=v;++i){
for(int j=1;j<=v;++j){
if(graph[i][k]==987654321||graph[k][j]==987654321) continue;
graph[i][j]=min(graph[i][j],graph[i][k]+graph[k][j]);
}
}
}
for(int i=1;i<=v;++i){
ans=min(graph[i][i],ans);
}
if(ans==987654321) ans=-1;
cout<<ans;
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 27978 보물 찾기 2 C++ (0) | 2024.10.10 |
---|---|
백준 10830 행렬 제곱 C++ (1) | 2024.10.06 |
백준 17069 파이프 옮기기 2 C++ (2) | 2024.10.02 |
백준 2294 동전 2 C++ (1) | 2024.09.30 |
백준 14502 연구소 C++ (4) | 2024.09.26 |