dijkstra算法求單源最短路徑思路(圖解)


dijkstra算法求單源最短路徑

貪心算法

思路概括
需要用到的數據結構:
一維數組dist[n]--根據下標存放源點到所有其他點的最短路徑,
例如:dist[1]=10, 表示源點到達結點1的最短路徑的長度為10

一維數組path[n]--根據下標存放某個點的前一個點的信息,這個點是所有能夠到達該點中路徑最短的一個點
例如:path[2]=3, 表示能夠從結點3到達結點2,並且結點3到結點2的距離是所有到達結點2中最短的

一維標記數組S[n]--根據下標存放bool值,表示該點已經找到到達該點的最短路徑

minval--存放每一輪循環中dist[n]中最小的值,k--存放該最小值對應的結點

思路:
從選取的源點求到其余所有n個點的最短路徑,需要n次循環
每次循環找到某一個點的最短路徑,重復n次就能找到源點到每一個結點的最短路徑

具體看圖:

循環結束時,dist就保存了源點到所有其他點的最短距離,path也保存好了直接前驅,通過適當的輸出即可求出單源最短路徑

代碼如下:

點擊查看代碼
class Solution {
public:
	void GetPath(vector<vector<int>>vec,int v0) {
		int size = vec.size();
		int S[MAX], k, minval;
		
		vector<int>dist(size);//dist存放單源最短路徑
		vector<int>path(size);

		//初始化
		for (int i = 0; i < size; i++) {
			dist[i] = vec[v0][i];
			if (dist[i] != MAX)path[i] = v0;
			else path[i] = -1;
		}
		S[v0] = 1;
		dist[v0] = 0; 
		int num = 1;
		path[v0] = -1;
		while (num < size) {
			k = 0; minval = MAX;
			for(int i=0;i<size;i++)
				if ((dist[i] < minval) && (S[i] != 1)) {
					minval = dist[i];
					k = i;
				}
			S[k] = 1;
			for(int i=0;i<size;i++)
				if ( dist[k] + vec[k][i]<dist[i] ) {
					dist[i] = dist[k] + vec[k][i];
					path[i] = k;
				}
			num++;
		}
		cout<<"\n源點到各頂點的最短路徑長和路徑:";
		for (int i = 0; i != size; i++) {
			if (i == v0 )cout << "\n"<<dist[i]<< "\tpath:" << i << " <- " << v0;
			else if (dist[i] == MAX)cout<<"\n無路徑" << "\tpath:" << i << " <- " << v0;
			else {
				cout << "\n" << dist[i] << "\tpath:" << i << " ";
				int pre = path[i];
				while (pre != -1) {
					cout << " <- " << pre << ' ';
					pre = path[pre];
				}
			}
		}
	}

};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM