A1030 Travel Plan (30 分)

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int inf = 10000000;
const int maxn = 510;
int N, M, S, D;
int cost[maxn][maxn], wei[maxn][maxn]; 
int used[maxn], d[maxn], w[maxn]; 
int pre[maxn];
void init(){
	fill(cost[0], cost[0] + maxn * maxn, inf);
	fill(wei[0], wei[0] + maxn * maxn, inf);
	fill(d, d + maxn, inf);
	fill(w, w + maxn, inf);
} 
void dijkstra(){
	d[S] = 0;
	w[S] = 0;
	for(int i = 0; i < N; i++){
		int u = -1, Min = inf; 
		for(int v = 0; v < N; v++){
			if(used[v] == 0 && d[v] < Min){
				Min = d[v]; u = v;
			}
		}
		if(u == -1) break;
		used[u] = 1;		
		for(int v = 0; v < N; v++){
			if(used[v] == 0 && cost[u][v] != inf){
				if(d[v] > d[u] + cost[u][v]){
					d[v] = d[u] + cost[u][v];
					w[v] = w[u] + wei[u][v];
					pre[v] = u;
				}else if(d[v] == d[u] + cost[u][v]){
					if(w[v] > w[u] + wei[u][v]){
						w[v] = w[u] + wei[u][v];
						pre[v] = u;
					}
				}							
			}				
		}		
	}
}
void getPath(int x){
	if(x == S){
		printf("%d", x); return;
	}
	getPath(pre[x]);
	printf(" %d", x);
}
void solve(){
	dijkstra();
	getPath(D);
	printf(" %d %d\n", d[D], w[D]);	
}
int main(){
	init();
	scanf("%d %d %d %d", &N, &M, &S, &D);
	int x, y, w1, w2;	
	for(int i = 0; i < M; i++){
		scanf("%d %d %d %d", &x, &y, &w1, &w2);
		cost[x][y] = cost[y][x] = w1;
		wei[x][y] = wei[y][x] = w2;
	}
	solve();
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值