start -> end 로 갈때의 최단거리를 구하는 문제.
Dijkstra를 사용함.
만약 here -> there을 갈 때,
int there = edges[here][i].v;
u -> here -> there 가 더빠른게 생기면 업데이트 된다.
if (distance[there] > nextDist) {
1 -> 3 -> 5
4다.
처음 1 -> 5 에 10
3 -> 5 1해가지고 3 + 1 = 4
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
#include <vector> | |
#include <queue> | |
/** | |
* https://www.acmicpc.net/problem/191 | |
* BOJ 백준온라인져지 1916 최소비용 구하기 풀이 | |
*/ | |
#define INF 1100000000 | |
struct Edge{ | |
int v, w; | |
}; | |
using namespace std; | |
int main(){ | |
int city, bus; | |
scanf("%d%d", &city, &bus); | |
int *distance = new int[city + 1]; | |
Edge edge; | |
vector<vector<Edge> > edges; | |
edges.resize(1001); | |
for(int i = 1; i <= bus; i++){ | |
int u, v, w; | |
scanf("%d%d%d", &u, &v, &w); | |
edge.v = v; | |
edge.w = w; | |
edges[u].push_back(edge); | |
} | |
for(int i = 1; i <= city; i++){ | |
distance[i] = INF; | |
} | |
int start, end; | |
scanf("%d%d", &start, &end); | |
distance[start] = 0; | |
bool *visited = new bool[city + 1]; | |
priority_queue<pair<int, int> > pq; | |
pq.push(make_pair(0, start)); | |
while(pq.size()){ | |
int here = pq.top().second; | |
int hereDist = pq.top().first; | |
pq.pop(); | |
for (int i = 0, size = edges[here].size(); i < size; i++) { | |
int there = edges[here][i].v; | |
int nextDist = hereDist + edges[here][i].w; | |
if (distance[there] > nextDist) { | |
distance[there] = nextDist; | |
pq.push(make_pair(nextDist, there)); | |
} | |
} | |
} | |
printf("%d", distance[end]); | |
} |
'IT > 알고리즘' 카테고리의 다른 글
BOJ 백준온라인져지 1916 최소비용 구하기 풀이 (0) | 2017.12.12 |
---|---|
BOJ 백준온라인져지 2953 나는 요리사다 풀이 (0) | 2017.12.11 |
BOJ 백준온라인져지 2702 초6 수학 풀이 (0) | 2017.12.11 |
BOJ 백준온라인져지 13410 거꾸로 구구단 풀이 (0) | 2017.12.11 |
BOJ 백준온라인져지 2711 오타맨 고창영 풀이 (0) | 2017.12.11 |