Module: Dijkstra'nın algoritması


Problem

8/14

Dijkstra'nın O(M logN) c setindeki algoritması: Başlat (C++)

Theory Click to read/hide

Dijkstra'nın algoritmasının naif uygulamasının asimptotik davranışı: \(O(n^2 + m)\) olduğundan, köşe sayısı arttıkça, işin hızı tatmin edici olmaz.
 Geliştirme için çeşitli veri yapıları kullanılabilir: Fibonacci yığınları, küme kümeleri veya öncelik kuyruğu priority_queue. 
set ile bir örnek düşünün, sonuç olarak, son asimptotik: \(O(n log (m))\) , ayrıntılar.

Problem

Size yönlendirilmiş ağırlıklı bir grafik verilir. Belirli bir köşeden diğerine en kısa mesafeyi bulun.
 
Giriş
İlk satır üç sayı içerir: N, M, S ve F (1≤ N≤ 100, 1≤ S, F≤ N), burada N – grafik köşe sayısı, M – kaburga sayısı,  S– ilk tepe noktası ve F –ndash; son. Sonraki N satırın her birine 100'ü geçmeyecek şekilde N sayı girin, – grafik bitişiklik matrisi, burada -1, köşeler arasında kenar olmaması ve negatif olmayan herhangi bir sayı anlamına gelir -ndash; verilen ağırlıkta bir kenarın varlığı. Matrisin ana köşegenine sıfırlar yazılır.
 
Çıktı
İstenilen mesafenin veya belirtilen köşeler arasında yol yoksa -1 gösterilmesi gerekir.

Örnekler
# Girdi Çıktı
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 <set>
#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);
		// чтение графа  
		vector<int> d(n+1, INF);
		d[s] = 0;
		set < pair<int, int> > q;
		q.insert(make_pair(d[s], s));
		while (!q.empty()) {
			int v = q.begin()->second;
			q.erase(q.begin());

			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]) {
					q.erase(make_pair(d[to], to));
					d[to] = d[v] + len;
					q.insert(make_pair(d[to], to));
				}
			}
		}

		if (d[f] == 10000000)
			cout << "-1";
		else
			cout << d[f];
	}      

     

Program check result

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