PTA团体程序设计天梯赛练习集:《L2-001 紧急救援》题解

题意:

条件:给出M条路、起点和终点以及每个点含有的救援队的数量。

要求:

1. 找出从起点到终点的最短路径的条数
2. 所有最低路径中能召集最多救援队的数量。 
3. 能召集最多救援队的最短路径


思路:
求单源最短路径可以使用Dijstra算法。
复杂度为:500^2 ,不会超时。

Dijstra算法:

思想:

G(V,E)V表示图中所有的顶点,E表示图中所有的边。
对G(V,E)设置一个集合S,存放访问过的顶点,从集合V-S
中选择与起点s的最短距离最小的一个顶点(记为u),访问并加入集合S,
之后,令顶点u为中介点,优化起点s与所有从u能到达的顶点v之间的最短距离。
这样的操作执行n次,直到S中包含所有顶点。
参考:算法笔记

基本模板(找出从起点到其他各点的最短距离):

const int INF = 0x3f3f3f3f;
//以邻接表形式保存图,稀疏图用邻接表,稠密图用邻接矩阵
typedef struct{
   
	int next;
	int len;
}
vector<Node> V[N];

bool vis[N];//标记访问过的顶点
int dis[N];//记录从起点开始到其他各点的距离
void Dijstra(int s){
   
	//起点到自身的距离为0
	dis[s] = 0;
	//循环n次
	for(int i = 0; i < n; i++){
   
		int u = -1;
		int min = INF;
		//选择与起点s的最短距离最小的一个未访问顶点(记为u)
		for(int j = 0; j < n; j++){
   
			if(!vis[j] && dis[j] < min){
   
				u = j;
				min = dis[j] 
			}
		}
		//如果找不到未被访问过的顶点,说明找不到其他与s相通的顶点,跳出循环
		if(u == -1){
   
			break;
		}
		//标记u为已访问
		vis[u] = true;
		//令顶点u为中介点,优化起点s与所有从u能到达的顶点v之间的最短距离
		for(int j = 0; j < V[u].size(); j++){
   
			int v = V[u][j].next;
			int len = V[u][j].len;
			//如果v已经访问过,则跳过该点
			if(vis[v]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值