Module: Dijkstra의 알고리즘


Problem

9/14

Priority_queue가 있는 O(M logN)의 Dijkstra 알고리즘: 시작(C++)

Problem

방향 가중치 그래프가 제공됩니다. 주어진 정점에서 다른 정점까지의 최단 거리를 찾습니다.
 
입력
첫 번째 줄에는 N, M, S 및 F(1≤ N≤ 100, 1≤ S, F≤ N)의 세 숫자가 포함되어 있습니다. 그래프 꼭지점의 수, M – 갈비뼈의 수,  S– 초기 정점 및 F – 결정적인. 다음 N 줄에 각각 100을 넘지 않는 N개의 숫자를 입력하세요. – 그래프 인접 행렬, 여기서 -1은 꼭짓점 사이에 가장자리가 없고 음수가 아닌 숫자를 의미합니다. 주어진 가중치의 가장자리가 존재합니다. 0은 매트릭스의 주대각선에 기록됩니다.
 
출력
지정된 꼭짓점 사이에 경로가 없으면 원하는 거리 또는 -1을 표시해야 합니다.

<헤드> <일># <몸>
입력 출력
1 4 4 3 4
3 1 3
1 2 3
2 4 3
3 4 10
9
Write the program below
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

	const int INF = 1000000000;

	int main() {
		int n, m ,s, f;
		cin >> n>>m>>s>>f;
		
		vector < vector < pair<int, int> > > g(n+1);
		 for (int i = 0; i < m; i++)
		{
			int x, y, z;
			cin >> x >> y >> z;
			g[x].push_back(make_pair(y, z));
		}

		vector<int> d(n+1, INF);
		d[s] = 0;
		priority_queue < pair<int, int> > q;
		q.push(make_pair(0, s));
		while (!q.empty()) {
			int v = q.top().second, cur_d = -q.top().first;
			q.pop();
			if (cur_d > d[v])  continue;

			for (size_t j = 0; j < g[v].size(); ++j) {
				int to = g[v][j].first,
					len = g[v][j].second;
				if (d[v] + len < d[to]) {
					d[to] = d[v] + len;
					
					q.push(make_pair(-d[to], to));
				}
			}
		}    
}    

     

Program check result

To check the solution of the problem, you need to register or log in!