1030 Travel Plan (30point(s)) 需要二看 *看一看,最短路径没前面几道难

基本思想:

附带路径代价的最短路径生成;

 

关键点:

无;

 

#include<iostream>
#include<fstream>
#include<sstream>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;

const int maxn = 510;
const int INF = 100000;

int n, m, s, d;
int ma[maxn][maxn];
int weight[maxn][maxn];
bool vis[maxn];
int dis[maxn];
int w[maxn];
int pre[maxn];


void dij(int st) {
	fill(vis, vis + maxn, true);
	fill(dis, dis + maxn, INF);
	fill(w, w + maxn, INF);
	for (int i = 0; i < n; i++) {
		pre[i] = i;
	}
	dis[st] = 0;
	w[st] = 0;
	for (int i = 0; i < n; i++) {
		int index = -1;
		int min = INF;
		for (int j = 0; j < n; j++) {
			if (vis[j] && dis[j] < min) {
				min = dis[j];
				index = j;
			}
		}
		if (index == -1)
			return;
		vis[index] = false;
		for (int j = 0; j < n; j++) {
			if (vis[j] && ma[index][j] != INF) {
				if (dis[j] > ma[index][j] + dis[index]) {
					dis[j] = ma[index][j] + dis[index];
					w[j] = weight[index][j] + w[index];
					pre[j] = index;
				}
				else if (dis[j] == ma[index][j] + dis[index]) {
					if (w[j] > weight[index][j] + w[index]) {
						//如果更小;
						w[j] = weight[index][j] + w[index];
						pre[j] = index;
					}
				}
			}
		}
	}
}

void dfs(int v) {
	if (pre[v] != v)
		dfs(pre[v]);
	printf("%d ", v);
}

int main(){
	fill(weight[0], weight[0] + maxn*maxn, 0);
	fill(ma[0], ma[0] + maxn*maxn, INF);
	cin >> n >> m >> s >> d;
	int a, b;
	for (int i = 0; i < m; i++) {
		cin >> a >> b;
		cin >> ma[a][b] >> weight[a][b];
		ma[b][a] = ma[a][b];
		weight[b][a] = weight[a][b];
	}
	dij(s);
	dfs(d);
	printf("%d ", dis[d]);
	printf("%d", w[d]);
	return 0;
}

  

posted @ 2020-02-29 16:58  暮云林凌  阅读(183)  评论(0)    收藏  举报