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 分)的更多相关文章

  1. PTA数据结构与算法题目集(中文) 7-34

    PTA数据结构与算法题目集(中文)  7-34 7-34 任务调度的合理性 (25 分)   假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行.“ ...

  2. PTA数据结构与算法题目集(中文) 7-31

    PTA数据结构与算法题目集(中文)  7-31 7-31 笛卡尔树 (25 分)   笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2.首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有 ...

  3. PTA数据结构与算法题目集(中文) 7-26

    PTA数据结构与算法题目集(中文)  7-26 7-26 Windows消息队列 (25 分)   消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生, ...

  4. PTA数据结构与算法题目集(中文) 7-14

    PTA数据结构与算法题目集(中文)  7-14 7-14 电话聊天狂人 (25 分)   给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录 ...

  5. PTA数据结构与算法题目集(中文) 7-33

    PTA数据结构与算法题目集(中文)  7-33 7-33 地下迷宫探索 (30 分)   地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的 ...

  6. PTA数据结构与算法题目集(中文) 7-16

    PTA数据结构与算法题目集(中文)  7-16 7-16 一元多项式求导 (20 分)   设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000 ...

  7. PTA数据结构与算法题目集(中文) 7-10

    PTA数据结构与算法题目集(中文)  7-10 7-10 公路村村通 (30 分)   现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低 ...

  8. PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分)   给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...

  9. PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分)   给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...

  10. PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分)

    PTA数据结构与算法题目集(中文)  7-41PAT排名汇总 (25 分) 7-41 PAT排名汇总 (25 分)   计算机程序设计能力考试(Programming Ability Test,简称P ...

随机推荐

  1. echarts-liquidfill 水球显示小数点

    使用echarts-liquidfill.js的水球,水球上显示的文字可以使用chartOption.series[0].label.normal.formatter设置,想显示什么显示什么. var ...

  2. C语言程序设计(九) 指针

    第九章 指针 C程序中的变量都是存储在计算机内存特定的存储单元中的,内存中的每个单元都有唯一的地址 通过取地址运算符&可以获得变量的地址 //L9-1 #include <stdio.h ...

  3. Python模块三

    collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...

  4. (转)GNU风格ARM汇编语法指南(非常详细)1

    原文地址:http://zqwt.012.blog.163.com/blog/static/120446842010111481551809/ 汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设 ...

  5. AVR单片机教程——走向高层

    本文隶属于AVR单片机教程系列.   在系列教程的最后一篇中,我将向你推荐3个可以深造的方向:RTOS.C++.事件驱动.掌握这些技术可以帮助你更快.更好地开发更大的项目. 本文涉及到许多概念性的内容 ...

  6. kafka使用指南

    快速开始 本教程假设您刚刚开始,并且没有现有的Kafka或ZooKeeper数据.由于Kafka控制台脚本对于基于Unix和Windows的平台是不同的,因此在Windows平台上使用bin\wind ...

  7. 038.集群网络-K8S网络实现

    一 Kubernetes网络实现 1.1 Kubernetes网络优势 在实际的业务场景中,业务组件之间的关系十分复杂,微服务的理念更是让应用部署的粒度更加细小和灵活.为了支持业务应用组件的通信,Ku ...

  8. CSS导入方式和六种选择器

    1.css的导入方式 1.1 行内嵌式 1.2 内部方式 1.2.1含义: css代码写在<head>的<style>标签中 1.2.2 优点 方便在同页面中修改样式 1.2. ...

  9. PHP session反序列化

    先来了解一下关于session的一些基础知识 什么是session 在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 ...

  10. [模拟]Educational Codeforces Round 2A Extract Numbers

    Extract Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...