Dijkstra(迪杰斯特拉)算法

#include<iostream>
#include<memory.h>

#define Longest_Length 0X0FFFFFF

using namespace std;

int main(){
	//Initialize
	int n, k, start, finish, weight;
	cout << "Please input the number of verticles in the graph:" << endl;
	cin >> n;
	//--------------------Define------------------------
	int **edge = new int *[n + 1];
	int *dis = new int[n + 1];
	bool *visited = new bool[n + 1];
	//--------------------------------------------------
	for(int i = 0; i <= n; i++) dis[i] = Longest_Length;
	for(int i = 0; i <= n; i++) visited[i] = false;
	for(int i = 0; i <= n; i++) edge[i] = new int[n + 1];
	for(int i = 0; i <= n; i++)
		for(int j = 0; j <= n; j++)
			edge[i][j] = Longest_Length;
	//--------------------------------------------------
	cout << "Please input the number of edges in the graph:" << endl;
	cin >> k;
	cout << "Please input the weight of edge with the indexes of its starting point and finishing point:" << endl;
	for(int i = 0; i < k; i++){
		cin >> start >> finish >> weight;
		edge[start][finish] = weight;
	}
	cout << "Please input the starting point:" << endl;
	cin >> start;
	cout << "Please input the finishint point:" << endl;
	cin >> finish;
	//Dijkstra
	int cur = start;
	int *pre = new int[n + 1];
	visited[start] = true;
	dis[start] = 0;
	pre[start] = -1;
	for(int m = 1; m < n; m++){	//find all vertices
		for(int i = 1; i <= n; i++){
			if(!visited[i] && edge[cur][i] < Longest_Length && dis[i] > dis[cur] + edge[cur][i]){
				dis[i] = dis[cur] + edge[cur][i];
				pre[i] = cur;
			}
		}
		int min = Longest_Length, index;
		for(int j = 1; j <= n; j++){
			if(!visited[j] && dis[j] < min){
				min = dis[j];
				index = j;
			}
		}
		cur = index;
		visited[cur] = true;
	}
	cout << "The mininum length is:" << endl;
	cout << dis[finish] << endl;
	cout << "The road is:" << endl;
	for(int i = finish; pre[i] != -1;){
		cout << pre[i] << "->" << i << endl;
		i = pre[i];
	}
	return 0;
}
发布了135 篇原创文章 · 获赞 23 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/LightInDarkness/article/details/86496480