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题目分析:

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<malloc.h>
  5 #define INIFITY 65535
  6 typedef struct ENode* Edge;
  7 struct ENode
  8 {
  9     int V1,V2;
 10     int Weight;
 11 };
 12 typedef struct GNode* Graph;
 13 struct  GNode
 14 {
 15     int G[510][510];
 16     int Nv;
 17     int Ne;
 18 };
 19
 20 int IsEdge(Graph Gra, int V1, int V2)
 21 {
 22     return Gra->G[V1][V2]!=INIFITY;
 23 }
 24
 25 void Insert(Graph Gra, Edge E)
 26 {
 27     Gra->G[E->V1][E->V2] = E->Weight;
 28     Gra->G[E->V2][E->V1] = E->Weight;
 29 }
 30
 31 Graph CreateGraph(int Nv)
 32 {
 33     Graph Gra = (Graph)malloc(sizeof(struct GNode));
 34     Gra->Nv = Nv;
 35     Gra->Ne = 0;
 36     for (int i = 0; i < Gra->Nv; i++)
 37         for (int j = 0; j < Gra->Nv; j++)
 38             Gra->G[i][j] = INIFITY;
 39     return Gra;
 40 }
 41
 42 int WeightInNode[510];
 43 int SumOfWeight[510];
 44
 45 int Dist[510];
 46 int Path[510];
 47 int Times[510];
 48 int Collected[510];
 49 int FindMinDist(Graph Gra)
 50 {
 51     int MinDist = INIFITY;
 52     int Min = -1;
 53     for (int i = 0; i < Gra->Nv; i++)
 54     {
 55         if (!Collected[i]&&Dist[i] < MinDist)
 56         {
 57             MinDist = Dist[i];
 58             Min = i;
 59         }
 60     }
 61     if (MinDist != INIFITY)
 62         return Min;
 63     else
 64         return 0;
 65 }
 66
 67 void Dijkstra(Graph Gra, int V)
 68 {
 69     SumOfWeight[V] = WeightInNode[V];
 70     for (int i = 0; i < Gra->Nv; i++)
 71     {
 72         Dist[i] = Gra->G[V][i];
 73         if (IsEdge(Gra, V, i))
 74         {
 75             SumOfWeight[i] = SumOfWeight[V] + WeightInNode[i];
 76             Path[i] = V;
 77             Times[i] = 1;
 78         }
 79         else
 80             Path[i] = -1;
 81     }
 82
 83     Dist[V] = 0;
 84     Collected[V] = 1;
 85     while (1)
 86     {
 87         int i = FindMinDist(Gra);
 88         if (!i)
 89             break;
 90         Collected[i] = 1;
 91         for (int j = 0; j < Gra->Nv; j++)
 92         {
 93             if(!Collected[j]&&IsEdge(Gra,i,j))
 94                 if (Dist[i] + Gra->G[i][j] < Dist[j])
 95                 {
 96                     Times[j] = Times[i];
 97                     Dist[j] = Dist[i] + Gra->G[i][j];
 98                     SumOfWeight[j] = SumOfWeight[i] + WeightInNode[j];
 99                     Path[j] = i;
100                 }
101                 else if (Dist[i] + Gra->G[i][j] == Dist[j])
102                 {
103                     Times[j] += Times[i];
104                     if (SumOfWeight[i] + WeightInNode[j] >=SumOfWeight[j])
105                     {
106                         SumOfWeight[j] = SumOfWeight[i] + WeightInNode[j];
107                         Path[j] = i;
108                     }
109                 }
110         }
111     }
112 }
113
114 int k = 0;
115 void Print(int D)
116 {
117     if (Path[D] != -1)
118     {
119         Print(Path[D]);
120     }
121     if (k == 0)
122     {
123         printf("%d", D);
124         k++;
125     }
126     else
127         printf(" %d",D);
128 }
129
130 int main()
131 {
132     int N, M, S, D;
133     scanf("%d%d%d%d", &N, &M, &S, &D);
134     Graph Gra = CreateGraph(N);
135     Gra->Ne = M;
136     for (int i = 0; i < Gra->Nv; i++)
137         scanf("%d", &WeightInNode[i]);
138     Edge E = (Edge)malloc(sizeof(struct ENode));
139     for (int i = 0; i < Gra->Ne; i++)
140     {
141         scanf("%d%d%d", &(E->V1), &(E->V2), &(E->Weight));
142         Insert(Gra, E);
143     }
144     Dijkstra(Gra, S);
145     printf("%d %d\n", Times[D], SumOfWeight[D]);
146     Print(D);
147     return 0;
148 }

原文地址:https://www.cnblogs.com/57one/p/11665896.html

时间: 2024-12-13 05:13:09

PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)的相关文章

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

PTA数据结构与算法题目集(中文)  7-14 7-14 电话聊天狂人 (25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤),为通话记录条数.随后N行,每行给出一条通话记录.简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔. 输出格式: 在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔.如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数. 输入样例: 4 130057

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

PTA数据结构与算法题目集(中文)  7-16 7-16 一元多项式求导 (20 分) 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格. 输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0题目分析:要注意判断输入停止的标志 利用~scanf来判断 其它问题到没发现 (

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

PTA数据结构与算法题目集(中文)  7-27 7-27 家谱处理 (30 分) 人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究.实验中,使用计算机处理家谱.为了实现这个目的,研究人员将家谱转换为文本文件.下面为家谱文本文件的实例: John Robert Frank Andrew Nancy David 家谱文本文件中,每一行包含一个人的名字.第一行中的名字是这个家族最早的祖先.家谱仅包含最早祖先的后代,而他们的丈夫或妻子不出现在家谱中.每个人的子女比父母多缩进2个空格.

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

PTA数据结构与算法题目集(中文)  7-32 7-32 哥尼斯堡的“七桥问题” (25 分) 哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示. 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学. 这个问题如今可以描述为判断欧拉回路是否存在的问题.欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个无向图,问是否存在欧拉回路? 输

PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)

PTA数据结构与算法题目集(中文)  7-36 社交网络图中结点的“重要性”计算 (30 分) 7-36 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱.而结点根据其所处的位置不同,其在网络中体现的重要性也不尽相同. “紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的结点能够

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

PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数(将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余数法将整数映射到长度为P的散列表中.例如将字符串AZDEG插入长度为1009的散列表中,我们首先将26个大写英文字母顺序映射到整数0~25:再通过移位将其映射为3:然后根据表长得到,即是该字符串的散列映射位置. 发生冲突时请

PTA 数据结构与算法题目集 6-1

单链表的反转 回顾题目戳这里 https://pintia.cn/problem-sets/15/problems/724 带头节点的反转代码 List Reverse( List L ){ List head = (List)malloc(sizeof(PtrToNode)); head->Next = NULL; List cur = L,nNode; while(cur){ nNode = cur->Next; cur->Next = head->Next; head->

[PTA] 数据结构与算法题目集 6-1 单链表逆转

List Reverse(List L) { List p, q; p = L; q = L; L = NULL; while (p) { p = p->Next; q->Next = L; L = q; q = p; } return L; } 原文地址:https://www.cnblogs.com/ruoh3kou/p/9975225.html

[PTA] 数据结构与算法题目集 6-2 顺序表操作集

//创建并返回一个空的线性表: List MakeEmpty() { List L; L = (List)malloc(sizeof(struct LNode)); L->Last = -1; //因为插入一个时,Last++,此时需为-1 return L; } //返回线性表中X的位置.若找不到则返回ERROR: Position Find(List L, ElementType X) { for (int i = 0; i <= L->Last; i++) { if (L->