새소식

코딩테스트/백준_골드

[C++][백준 1956] 운동

  • -

[문제]

1956번: 운동 (acmicpc.net)

 

1956번: 운동

첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의

www.acmicpc.net


[문제 풀이]

플로이드 워셜을 이용해서 풀도록 하자.

플로이드 워셜 알고리즘을 사용한 뒤에 행렬에서 [i][i]가 존재한다면 자기 자신으로 돌아오는 사이클이 있다는 의미이므로 i,i 를 모두 확인해 준 뒤 min값을 꺼내자.

*주의 사항 : 만약 사이클이 없다면 -1을 출력하자.

*주의 사항2 : 거리는 10,000 이하이고 마을은 400까지 있으니 4,000,000 까지 갈 수가 있다. 그러니 INF 값을 4,000,000 이상의 값으로 하지 않으면 오류가 발생한다.


[코드]

#include<iostream>
#include<algorithm>
#include <vector>

using namespace std;

const int INF = 10000000;
int v,e;
int country[401][401];

void output(){
    cout<<"----output-----"<<endl;
    for(int i = 1;i<=v;i++){
        for(int j = 1;j<=v;j++){
            cout<<country[i][j]<<" ";
        }
        cout<<endl;
    }
    return;
}

void floid(){
    for(int k = 1;k<=v;k++){
        for(int i = 1;i<=v;i++){
            for(int j = 1;j<=v;j++){
                if(country[i][j] > country[i][k] + country[k][j]){
                    country[i][j] = country[i][k] + country[k][j];
                }
            }
        }
    }
    return;
}

void solve(){
    floid();
    int answer = INF;
    for(int i = 1;i<=v;i++){
        if(answer > country[i][i]){
            answer = country[i][i];
        }
    }

    cout<< ((answer == INF) ? -1 :answer )<<endl;
    
    return;
}

int main(){
    cin>>v>>e;
    for(int i = 0;i<=v;i++){
        fill(country[i],country[i]+v + 1,INF);
    }

    for(int i = 0;i<e;i++){
        int a,b,c;
        cin>>a>>b;
        cin>>c;
        country[a][b] = c;
    }

    solve();

    return 0;
}

'코딩테스트 > 백준_골드' 카테고리의 다른 글

[C++][백준 10159] 저울  (0) 2022.11.02
[C++][백준 2617] 구슬 찾기  (0) 2022.11.02
[C++][백준 2166] 다각형의 면적  (0) 2022.10.29
[C++][백준 2458] 키 순서  (0) 2022.10.28
[C++][백준 11403] 경로 찾기  (0) 2022.10.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.