Problem Solving/BOJ

[백준 10473번] [Dijkstra] 인간 대포

  • -
728x90
반응형

Approach

최단 시간을 찾는 상황이므로 다익스트라 유형임을 쉽게 파악할 수 있다.

점이 100개밖에 안되므로, 배열을 통해 충분히 관리할 수 있다.

 

추가적으로 모든 지점을 향해서 발사할 수 있으므로, 다익스트라에서 모든 정점에 대해서 확인해주면 된다.

다만, 처음 위치하는 곳에서는 무조건 걸어야하므로 따로 boolean flag를 통해 정리해주면 된다.

Code

#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<double, int> pdi;
int move_x[4] = {-1, 1, 0, 0};
int move_y[4] = {0, 0, -1, 1};
double INF = 2000.0;
double distance(pdd& v1, pdd& v2){
    return sqrt(pow(v1.first - v2.first, 2) + pow(v1.second - v2.second, 2));
}

int main() {
    fastio;
    double s_x, s_y, e_x, e_y;
    cin >> s_x >> s_y >> e_x >> e_y;

    int n;
    cin >> n;
    vector<pdd> v;
    v.push_back({s_x, s_y});

    for(int i = 0; i < n; i++){
        double a, b;
        cin >> a >> b;
        v.push_back({a, b});
    }
    v.push_back({e_x, e_y});

    double dist[102];
    fill(dist, dist + 102, INF);
    dist[0] = (double)0;
    priority_queue<pdi, vector<pdi>, greater<pdi> > pq;
    pq.push({0, 0});

    bool flag = true;

    while(!pq.empty()){
        double cur_cost = pq.top().first;
        int cur = pq.top().second;
        pq.pop();
        if(dist[cur] < cur_cost) continue;
        for(int i = 0; i <= n + 1; i++){
            double length = distance(v[cur], v[i]);
            double walk_cost = length / 5;
            double shoot_cost = 2 + fabs(length - 50) / 5;
            double min_cost;
            if(flag){
                min_cost = walk_cost;
            }
            else{
                min_cost = min(walk_cost, shoot_cost);
            }
            if(cur_cost + min_cost < dist[i]){
                dist[i] = cur_cost + min_cost;
                pq.push({dist[i], i});
            }
        }
        flag = false;
    }

    cout << dist[n + 1] << "\n";
    return 0;
}
반응형
Contents

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

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