1003 Emergency (25 分)--- Dijkstra求解

31 篇文章 1 订阅

题目地址: 1003 Emergency (25 分)

本题本质就是求起点到目标点最短路径

#include <bits/stdc++.h> 
using namespace std;
int n, m, c1, c2; //n为城市数,m为道路数,c1为起点,c2为目标点 
int INF = 0x3fffffff;
const int maxn = 1010;
bool vis[maxn]; //标记该点是否被访问过 
int d[maxn]; //起点(c1)到各点(i)最短距离 
int resTeam[maxn]; //每一个点(城市)救援人数 
int adj[maxn][maxn]; //adj[x][y] 为 x 城市到 y 城市道路距离 
int maxresTeam[maxn]; //每条路径最多人数 
int pathCount[maxn]; //起点到各点最短路径条数 

void dijkstra() {
	//初始化
	fill(d,d+maxn,INF); //起点到各顶点距离初始化为正无穷 
	d[c1] = 0; //起点到起点距离为0 
	maxresTeam[c1] = resTeam[c1]; //起点救援人数
	pathCount[c1] = 1; //起点自己到自己条数为 1 
	
	for (int i = 0; i < n; i++) {
		int index = -1; //index 使 d[index] 最小 
		int min = INF; //存放该最小的d[index] 
		for (int j = 0; j < n; j++) { //查找该点到未访问点最小距离的点 
			if (vis[j] == true) continue; //被访问过,直接下一个循环 
			if (d[j] < min) { //更新最短距离 
				index = j;
				min = d[j];
			} 
		}
//		if (index == -1) return;
		if (min == INF || index == c2) break; //这两个条件选择一个就行 
		vis[index] = true; //标记点 index 已经被访问 
		
		//比较起点到 b 点距离和起点到 index 点,再从 index 到 b 距离,更新起点到 b 最短距离 
		for (int i = 0; i < n; i++) { 
			if (vis[i] == true || adj[index][i] == 0) continue; 
			if (adj[index][i] + d[index] < d[i]) { //出现距离小一点的路径 
				d[i] = adj[index][i] + d[index]; //更新起点到i点最小距离 
				maxresTeam[i] = maxresTeam[index] + resTeam[i]; //更新救援人数 
				pathCount[i] =  pathCount[index]; //更新起点到i点最短路径条数 
			} else if (adj[index][i] + d[index] == d[i]) { //两条路径长度相等 
				pathCount[i] += pathCount[index]; //从起点到该点路径条数=该点其他点到该点路径条数 + 从起点到 index 路径条数 
				if (maxresTeam[i] < maxresTeam[index] + resTeam[i]) { //更新最多救援人数 
					maxresTeam[i] = maxresTeam[index] + resTeam[i]; //如果从 index 到顶底 i 救援人数加上顶底 i 原来人数 大于已经保存的从起点到顶点i的人数 
				}
			} 
		}
	} 
}

int main() {
	scanf("%d %d %d %d", &n, &m, &c1, &c2);
	for (int i = 0; i < n; i++) {
		scanf("%d", &resTeam[i]); 
	}
	for (int i = 0; i < m; i++) {
		int x, y, len; 
		scanf("%d %d %d", &x, &y, &len);
		adj[x][y] = adj[y][x] = len;
	}
	
	dijkstra();
	
	printf("%d %d\n", pathCount[c2], maxresTeam[c2]); 
	
	return 0;
}

总结模板

void dijkstra() {
	初始化(起点) 
	
	查找起点到各点最短距离 
	for (i:0->n) {
		for(j:0->n ) {
			int index = -1; //index 使 d[index] 最小 
			int min = INF; //存放该最小的d[index] 
		} 
		
		index == -1  return
		
		比较起点到 b 点距离和起点到 index 点,再从 index 到 b 距离,更新起点到 b 最短距离 
		...
	}
}

算法笔记:提取码:6vur

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值