JonghoonAn
어제보다 하나 더
JonghoonAn
전체 방문자
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 프로젝트
    • 배운점
    • ML
    • 학교 공부
      • OS
      • 네트워크
      • 시스템 프로그래밍
      • 데이터베이스
      • 소프트웨어 분석 및 설계

블로그 메뉴

  • 홈
  • 알고리즘
  • 배운점
  • 학교 공부
  • 머신러닝

공지사항

인기 글

태그

  • 인공지능
  • ConvNets
  • 인공신경망
  • lecture9
  • convolutional network
  • 인공지능 학습
  • 역전파
  • 인공 신경망
  • 학습률
  • rnn
  • Backpropagation
  • 활성화 함수
  • lecture7
  • Learning rate
  • convolutional layer
  • CS231
  • conv
  • cs231n
  • 전이 학습
  • lecture6
  • recurrent network
  • CNN Architecture
  • neural network
  • lecture10
  • 가중치 초기화
  • activation function
  • convolutional neural network
  • pooling
  • Transfer learning
  • 합성곱

최근 댓글

최근 글

티스토리

JonghoonAn

어제보다 하나 더

백준 1238 : 파티 / 플로이드 워셜 알고리즘
알고리즘

백준 1238 : 파티 / 플로이드 워셜 알고리즘

2021. 5. 19. 20:33

문제

 

문제 분석

노드간의 최단거리를 만들어 두고, 파티 노드 X로 오고 가는 거리의 최댓값을 구하는 문제였다. 즉, 모든 노드간의 거리가 최단거리라고 할 때 A -> X -> A의 최댓값을 구하는 문제였다.

모든 노드로 부터 모든 노드로의 최단거리 문제를 구하는 문제였으므로 Floyd-warshall 알고리즘을 적용시켜서 풀면 된다고 생각했다.

근데 ㅋㅋㅋㅋ 적용시키면 풀릴것같은데 구현을 까먹었어서 잠시 현타가 왔었다. 아직 내 지식이 아닌가보다 하고 다시 서치했다. 알고리즘의 핵심은 모든 경로에 대해서 모든 노드를 거쳐갈 때를 확인하는 것이다.

 

즉, 1->3이라는 경로가 존재할 때 1->(2,4....) ->3 와 같이 그 외의 모든 노드를 중간에 넣어보면서 그 노드가 들어갈 때 총 거리가 더 줄어드는지 확인하는 것이다.  

참고로 이 알고리즘의 복잡도는 O(V^3)이고 다익스트라는 O(E + VlogV)이다.

코드

#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<string>
#include<list>
#include<vector>
#include<stack>
#include<queue> // priority_queue 포함
#include<set>
#include<unordered_set>
#include<map>
#include<unordered_map>

#include<algorithm>
#include<math.h>
#include<climits> // 자료형 limit포함

using namespace std;

typedef long long int lld;
typedef unsigned long long int uld;
typedef unsigned int ui;

const int MY_INT_MAX = 1000000000;

int input_map[1001][1001] = {0};
int dp[1001][1001] = {0};

void solution()
{
    // code
    int n,m,x;
    cin >> n >> m >> x;
    for(int i=0; i<=n; i++) for(int j=0; j<=n; j++) if(i != j) input_map[i][j] = MY_INT_MAX;
    for(int i=0; i<m; i++)
    {
        int a,b,c;
        cin >> a >> b >> c;
        input_map[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(input_map[i][j] > input_map[i][k] + input_map[k][j])
                    input_map[i][j] = input_map[i][k] + input_map[k][j];
            }
        }
    }
    int my_max = -1;
    for(int i=1; i<=n; i++) if(i != x) my_max = max(my_max, input_map[i][x] + input_map[x][i]);
    cout << my_max;
}

int main ()
{
    iostream::sync_with_stdio(0); // 이제 C stdio의 입출력 사용 불가
    cin.tie(NULL);
    cout.tie(NULL); // 개행도 \n로 하도록 하자.
    solution();
    return 0;
}// code

개선점?

알고리즘보단 알고리즘의 본질을 더 보도록하자....

 

저작자표시 비영리 변경금지 (새창열림)

'알고리즘' 카테고리의 다른 글

백준 10879번 Speak your mind!  (0) 2021.07.09
백준 14003 번 : 가장 긴 증가하는 부분 수열 5  (0) 2021.05.19
백준 20543 번 : 폭탄 던지는 태영이 / 2D prefix-sum  (1) 2021.05.19
2020 카카오 인턴십 for Tech developers 코딩테스트 3번  (0) 2021.05.07
2020 카카오 인턴십 for Tech developers 코딩테스트 2번  (0) 2021.05.07
    '알고리즘' 카테고리의 다른 글
    • 백준 10879번 Speak your mind!
    • 백준 14003 번 : 가장 긴 증가하는 부분 수열 5
    • 백준 20543 번 : 폭탄 던지는 태영이 / 2D prefix-sum
    • 2020 카카오 인턴십 for Tech developers 코딩테스트 3번
    JonghoonAn
    JonghoonAn
    https://github.com/jjong0225 숭실대 소프트
    hELLO. 티스토리 스킨을 소개합니다.
    제일 위로

    티스토리툴바