最短路径之迪杰斯特拉(Dijkstra)算法

    由于没啥事,就整理下之前的一些简单算法,如题,这次整理最短路径的Dijkstra算法。Dijkstra算法是基于贪心策略的一个算法,在计算单源点路径时比较实用。由于,图论的这些代码的测试数据比较冗长,所以我采用读文件的形式来获取这些值,读者可以借鉴一下。代码如下:

#include 
#include 
using namespace std;
const int N = 5;
const int Max = 65535;
int Dijkstra(int start, int end, int G[][N]);
int main(){
	int n, line;
	freopen("input.txt", "r", stdin);
	cin >> n >> line;
	
	int G[N][N] = {0};
	for (int i = 0; i < n; i++){
		for (int j = 0; j < n; j++){
			G[i][j] = Max;
		}
	}
	int p, q, length;
	
	for (int i = 0; i < line; i++){
		cin >> p >> q >> length;
		G[p][q] = length;
		G[q][p] = length;
	}
	
	int start, end;
	cin >> start >> end;
	
	cout << Dijkstra(start, end, G);
	
	return 0;
}
int Dijkstra(int start, int end, int G[][N]){
	int *s = new int[N];
	int *d = new int[N];
	//初始状态 
	for (int i = 0; i < N; i++){
		s[i] = 0;
		d[i] = G[start][i];
	}
	s[start] = 1;
	d[start] = 0;
	
	int select = start, temp;

	for (int i = 0; i < N; i++){
		temp = Max;
		//选择点 
		for (int j = 0; j < N; j++){
			if (temp > d[j] && s[j] == 0){
				temp = d[j];
				select = j;
			}
		}	
			s[select] = 1;
		//修改最短路径值	
		for (int k = 0; k < N; k++){
		    int newvalue = G[select][k] + d[select];
			if (newvalue < d[k]){
		    	d[k] = newvalue;
			}	
		}
	} 
	return d[end];
}

测试数据应该保存在input.txt,测试数据如下所示:

5 7
0 1 10
0 3 30
0 4 100
1 2 50
2 4 10
3 2 20
3 4 60
0 1

其中第一行包含两个数据,n,line分别表示顶点数和边数,接下来line行数据表示对应边和权值,最后一行的两个数据start和end分别表示起始点和终止点。

你可能感兴趣的:(C/C++算法)