中国大学MOOC-陈越、何钦铭-数据结构-2018秋 07-图6 旅游规划 (25 分)

#include <bits/stdc++.h>

#define INFINITY 65535

using namespace std;

const int maxnum = 500;
int dist[maxnum], cost[maxnum], Edge[maxnum][maxnum], Cost[maxnum][maxnum], collected[maxnum];
int N, M, S, D;

int FindMin();
void Dijkstra();

int main()
{
	#ifdef ONLINE_JUDGE
	#else
	freopen("in.txt", "r", stdin);
	#endif
		
	cin >> N >> M >> S >> D;
	
	int a, b;

	for(int i = 0; i < M; i++){
		
		cin >> a >> b;
		cin >> Edge[a][b] >> Cost[a][b];
		
		Edge[b][a] = Edge[a][b];
		Cost[b][a] = Cost[a][b];
		
	}
	
	for(int i = 0; i < N; i++){
		
		if(Edge[S][i] != 0){
			
			dist[i] = Edge[S][i];
			cost[i] = Cost[S][i];
			
		}else{
			
			dist[i] = cost[i] = INFINITY;
			
		}
	}
	
	Dijkstra();
	
	return 0;
}

int FindMin()
{
	
	int minimum = 500;
	int index = -1;
	
	for(int i = 0; i < N; i++){
		
		if(collected[i] == 0 && dist[i] < minimum){
			
			minimum = dist[i];
			index = i;
			
		}
	}
	
	return index;
	
}

void Dijkstra()
{
	
	int v;
	dist[S] = 0;
	collected[S] = 1;
	
	while(1){
		
		v = FindMin();
		
		if(v == -1) break;
		collected[v] = 1;
		
		for(int i = 0; i < N; i++){
			
			if(collected[i] == 0 && Edge[v][i]){
				
				if(dist[v] + Edge[v][i] < dist[i]){
					
					dist[i] = dist[v] + Edge[v][i];
					cost[i] = cost[v] + Cost[v][i];
					
				}else if(dist[v] + Edge[v][i] == dist[i] && cost[i] > cost[v] + Cost[v][i]){
					
					cost[i] = cost[v] + Cost[v][i];
					
				}
				
				
			}
		}
	}
	
	cout << dist[D] << " " << cost[D];
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值