PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)
PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出4个正整数N、M、S、D,其中N(2)是城市的个数,顺便假设城市的编号为0 ~ (;M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。
第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。
输出格式:
第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。
输入样例:
4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2
输出样例:
2 60
0 1 3
题目分析:一道图的单源有权最短路径题 利用Dijkstra算法 该题中有2个决定性因素 所以优先判断的那个 要更新次重要的那个因素
再者,计算最短路径的条数 要注意计算的方法 是利用前一个节点与后一个节点之间的关系来计算 具体来说 对于每一个找到最小路径的节点,它最短路径的次数与它前一个节点的最短路径次数相同,如果找到了另一种最短路径,那么总的最短路径次数要加上其另一种最短路径的上一个节点最短路径的次数
最后,在输出路径时 要利用到栈,仔细想想,递归也是用类似于栈的思想来实现的,所以可以用递归来实现输出
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define INIFITY 65535
typedef struct ENode* Edge;
struct ENode
{
int V1,V2;
int Weight;
};
typedef struct GNode* Graph;
struct GNode
{
int G[][];
int Nv;
int Ne;
}; int IsEdge(Graph Gra, int V1, int V2)
{
return Gra->G[V1][V2]!=INIFITY;
} void Insert(Graph Gra, Edge E)
{
Gra->G[E->V1][E->V2] = E->Weight;
Gra->G[E->V2][E->V1] = E->Weight;
} Graph CreateGraph(int Nv)
{
Graph Gra = (Graph)malloc(sizeof(struct GNode));
Gra->Nv = Nv;
Gra->Ne = ;
for (int i = ; i < Gra->Nv; i++)
for (int j = ; j < Gra->Nv; j++)
Gra->G[i][j] = INIFITY;
return Gra;
} int WeightInNode[];
int SumOfWeight[]; int Dist[];
int Path[];
int Times[];
int Collected[];
int FindMinDist(Graph Gra)
{
int MinDist = INIFITY;
int Min = -;
for (int i = ; i < Gra->Nv; i++)
{
if (!Collected[i]&&Dist[i] < MinDist)
{
MinDist = Dist[i];
Min = i;
}
}
if (MinDist != INIFITY)
return Min;
else
return ;
} void Dijkstra(Graph Gra, int V)
{
SumOfWeight[V] = WeightInNode[V];
for (int i = ; i < Gra->Nv; i++)
{
Dist[i] = Gra->G[V][i];
if (IsEdge(Gra, V, i))
{
SumOfWeight[i] = SumOfWeight[V] + WeightInNode[i];
Path[i] = V;
Times[i] = ;
}
else
Path[i] = -;
} Dist[V] = ;
Collected[V] = ;
while ()
{
int i = FindMinDist(Gra);
if (!i)
break;
Collected[i] = ;
for (int j = ; j < Gra->Nv; j++)
{
if(!Collected[j]&&IsEdge(Gra,i,j))
if (Dist[i] + Gra->G[i][j] < Dist[j])
{
Times[j] = Times[i];
Dist[j] = Dist[i] + Gra->G[i][j];
SumOfWeight[j] = SumOfWeight[i] + WeightInNode[j];
Path[j] = i;
}
else if (Dist[i] + Gra->G[i][j] == Dist[j])
{
Times[j] += Times[i];
if (SumOfWeight[i] + WeightInNode[j] >=SumOfWeight[j])
{
SumOfWeight[j] = SumOfWeight[i] + WeightInNode[j];
Path[j] = i;
}
}
}
}
} int k = ;
void Print(int D)
{
if (Path[D] != -)
{
Print(Path[D]);
}
if (k == )
{
printf("%d", D);
k++;
}
else
printf(" %d",D);
} int main()
{
int N, M, S, D;
scanf("%d%d%d%d", &N, &M, &S, &D);
Graph Gra = CreateGraph(N);
Gra->Ne = M;
for (int i = ; i < Gra->Nv; i++)
scanf("%d", &WeightInNode[i]);
Edge E = (Edge)malloc(sizeof(struct ENode));
for (int i = ; i < Gra->Ne; i++)
{
scanf("%d%d%d", &(E->V1), &(E->V2), &(E->Weight));
Insert(Gra, E);
}
Dijkstra(Gra, S);
printf("%d %d\n", Times[D], SumOfWeight[D]);
Print(D);
return ;
}
PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)的更多相关文章
- PTA数据结构与算法题目集(中文) 7-34
PTA数据结构与算法题目集(中文) 7-34 7-34 任务调度的合理性 (25 分) 假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行.“ ...
- PTA数据结构与算法题目集(中文) 7-31
PTA数据结构与算法题目集(中文) 7-31 7-31 笛卡尔树 (25 分) 笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2.首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有 ...
- PTA数据结构与算法题目集(中文) 7-26
PTA数据结构与算法题目集(中文) 7-26 7-26 Windows消息队列 (25 分) 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生, ...
- PTA数据结构与算法题目集(中文) 7-14
PTA数据结构与算法题目集(中文) 7-14 7-14 电话聊天狂人 (25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录 ...
- PTA数据结构与算法题目集(中文) 7-33
PTA数据结构与算法题目集(中文) 7-33 7-33 地下迷宫探索 (30 分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的 ...
- PTA数据结构与算法题目集(中文) 7-16
PTA数据结构与算法题目集(中文) 7-16 7-16 一元多项式求导 (20 分) 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000 ...
- PTA数据结构与算法题目集(中文) 7-10
PTA数据结构与算法题目集(中文) 7-10 7-10 公路村村通 (30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低 ...
- PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...
- PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分) 给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...
- PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分)
PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分) 7-41 PAT排名汇总 (25 分) 计算机程序设计能力考试(Programming Ability Test,简称P ...
随机推荐
- Python自定义模块
自定义模块 自定义模块(也就是私人订制),我们要自定义模块,首先就要知道什么是模块 一个函数封装一个功能,比如现在有一个软件,不可能将所有程序都写入一个文件,所以咱们应该分文件,组织结构要好,代码不冗 ...
- 11.C++ 动态内存管理
在dll中malloc的内存, 必须要在dll中free掉,否则无法编译通过 //dll文件 #include <stdio.h> #include <iostream> #d ...
- 关于动态路由中路由之间的跳转(页面a跳转到页面b)
由addRouters方法获取到后台的动态路由,要实现路由之间的跳转,不可直接用path: '***',而是将动态路由存储到vuex中,再从vuex中取得,如:this.$store.menu.nav ...
- go极其ide的安装
一.下载软件开发包 官网:https://golang.google.cn/ 二. 安装和配置SDK windows使用.msi一键安装 配置环境变量 GOROOT,自动的,默认将go安装到C:/ ...
- SpringBoot入门系列(七)Spring Boot整合Redis缓存
前面介绍了Spring Boot 中的整合Mybatis并实现增删改查,.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/ ...
- Spring Boot 结合 Redis 序列化配置的一些问题
前言 最近在学习Spring Boot结合Redis时看了一些网上的教程,发现这些教程要么比较老,要么不知道从哪抄得,运行起来有问题.这里分享一下我最新学到的写法 默认情况下,Spring 为我们提供 ...
- centos7安装部署opentsdb2.4.0
写在前面 安装HBase 在HBase中创建表结构 安装配置并启动opentsdb 写在前面 最近因为项目需要在读opentsdb的一部分源码,后面会做个小结分享出来.本人是不大喜欢写这种安装部署的文 ...
- kerberos系列之zookeeper的认证配置
本篇博客介绍配置zookeeper的kerberos配置 一.zookeeper安装 1.解压安装包和重命名和创建数据目录 tar -zxvf /data/apache-zookeeper-3.5.5 ...
- vmware导入ova文件踩坑记
问题来源 众所周知,所有的网络行为都会产生相应的网络流量,那么所有的网络攻击行为也有其对应的流量特点,那么是否能根据流量特点进而分析出其对应的是什么攻击行为呢? 我在虚拟机上使用vulnhub的靶场环 ...
- Jmeter之JSON提取器应用
在接口测试中有一个这样的场景:登录之后,需要进行昵称修改,怎么实现? 首先我们分别看下登录.昵称修改的接口说明: 以上业务中补充一点,昵称修改,还需要添加请求头Authorization传登录获取的t ...