《旅游规划》之dijkstra算法

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=500;
const int INF = 500;
int map[N+1][N+1][2];
int cost[N+1],dist[N];
int visited[N+1];
void dijkstra();
int main(){
	int n,m,s,d;
	cin>>n>>m>>s>>d;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			map[i][j][0] = INF;
			map[i][j][1] = INF;
			map[j][i][0] = INF;
			map[j][i][1] = INF;
		}
	} //初始化所有的路线和油费为INF
	for(int i=0;i<m;i++){
		int x,y,g,h;
		cin>>x>>y>>g>>h;
		map[x][y][0] = g;
		map[y][x][0] = g;
		map[x][y][1] = h;
		map[y][x][1] = h;
	} //写入两点之间的路线和油费,如果没有的话就还是INF。
	for(int i=0;i<n;i++){
		visited[i] = 0; //标记是否访问过
		dist[i] = map[s][i][0];
		cost[i] = map[s][i][1];
	} //因为题目要求是从s到d的结点,所以可以求出s到每个结点的最短距离,然后用dist[d],cost[d] 就可以输出答案。
	//因为求s---d 所以初始化s为访问过,且到s--s的距离为0
	visited[s] = 1;
	dist[s] = 0;
	dist[n] = INF; 
	cost[s] = 0;
	while(1){
		int v = n;
		//从未访问的且与s有边的结点中寻找最小值。
		for(int i=0;i<n;i++){
         	if(dist[i]<dist[v]&&visited[i]==0){
         		v = i;
         	}
		}
		if(v==n) break; // 如果v==n表示没有找到最小的距离,就退出
		visited[v] = 1; 
		for(int w=0;w<n;w++){
			if(visited[w]==0&&map[v][w][0]<INF){
				//如果s--v+v--w的距离<s--w的距离,则就更新s---w的值,取小的
				if(map[v][w][0]+dist[v]<dist[w]){
					dist[w] = map[v][w][0] + dist[v];
					cost[w] = map[v][w][1] + cost[v];
				}
				//如果路径相等,就比较钱数
				else if(map[v][w][0]+dist[v]==dist[w]&&cost[w]>=map[v][w][1]+cost[v]){
					cost[w] = cost[v] + map[v][w][1];
				}
			}
		} 
	}
	if(dist[d]<INF)
	cout<<dist[d]<<" "<<cost[d]<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38558834/article/details/79726639
今日推荐