Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- ㅣ풀이
- 시간 복잡도
- 백준 2447
- 구현
- 버킷 정렬
- C/C++ 구현
- 1764
- qorwns
- 별 찍기 10
- 백준
- dfs
- 백준 17822
- 해시구현
- c#
- 백준 1406
- 백준 5397
- 백준 17471
- 스택의 특징
- Stack 이란
- heap
- 백준 17779
- 풀이
- 해시 구현
- 백준 1158
- 자료구조
- AVL 시간 복잡도
- 원판 돌리기
- 게리멘더링2
- 조세퍼스 순열
- 5397
Archives
- Today
- Total
홍시홍의 프로그래밍
[백준 10473] 인간대포 본문
분류
다익스트라
요구사항
시작 위치에서 최소한의 시간으로 도착 위치로 도착하기
각 정점의 위치는 주어진다
풀이
정점에서 정점으로 이동하는데 최소거리가 되게 이동하기 -> 다익스트라
현재 정점에서 취할 수 있는 행동은 2가지이다
1. 도착 점까지 간다
2. 다른 정점으로 간다
크기가 100이니깐 모든 정점을 구하여 다익스트라를 사용할 수 있도록 한다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;
struct go {
double x;
double y;
};
struct go1 {
int x;
double y;
};
int n;
go map[110];
vector<go1> v[110];
double dist[110];
double get_dist(go a, go b) {
double d = sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
return d;
}
int main() {
scanf("%lf%lf%lf%lf", &map[0].x, &map[0].y, &map[1].x, &map[1].y);
scanf("%d", &n);
for (int i = 2; i < n + 2; i++) {
scanf("%lf%lf", &map[i].x, &map[i].y);
}
for (int i = 0; i < n + 2; i++) dist[i] = 987654321;
// 0 위치에서는 다른 거리까지 걸어갈수 밖에 없다.
//i 시작 위치 j 도착 위치
for (int i = 0; i < n + 2; i++) {
if (i == 1) continue;
for (int j = 1; j < n + 2; j++) {
if (i == j) continue;
if (i == 0) {
double nowdist = get_dist(map[i], map[j]) / 5.0;
// cout<<nowdist<<endl;
v[0].push_back({ j,nowdist });
continue;
}
if (i == 1) continue;
double nowdistwalk = get_dist(map[i], map[j]) / 5.0;
double nowdistcan = 2.0 + abs(get_dist(map[i], map[j]) - 50) / 5.0;
double nowmin = min(nowdistcan, nowdistwalk);
v[i].push_back({ j,nowmin });
// cout<<nowmin<<endl;
}
}
priority_queue<pair<double, int>, vector<pair<double, int>>, greater<pair<double, int>>> q;
dist[0] = 0;
q.push({ 0,0 });
while (!q.empty()) {
int nownode = q.top().second;
double nowdist = q.top().first;
q.pop();
for (int i = 0; i < v[nownode].size(); i++) {
int nextnode = v[nownode][i].x;
double nextdist = v[nownode][i].y;
if (dist[nextnode] > nowdist + nextdist) {
dist[nextnode] = nowdist + nextdist;
q.push({ dist[nextnode],nextnode });
}
}
}
printf("%.6lf\n", dist[1]);
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 2163] 초콜릿 자르기 (0) | 2020.04.25 |
---|---|
[백준 9461] 파도반 수열 (0) | 2020.04.25 |
[백준 6236] 용돈 관리 (0) | 2020.04.24 |
[백준 3108] 로고 (0) | 2020.04.11 |
[백준 1912] 연속합 (0) | 2020.04.09 |
Comments