5-35 城市间紧急救援 (25分)

5-35 城市间紧急救援   (25分)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:

输入第一行给出4个正整数NN、MM、SS、DD,其中NN(2\le
N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0
~ (N-1)(N?1);MM是快速道路的条数;SS是出发地的城市编号;DD是目的地的城市编号。

第二行给出NN个正整数,其中第ii个数是第ii个城市的救援队的数目,数字间以空格分隔。随后的MM行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式:

第一行输出最短路径的长度和和能够召集的最多的救援队数量。第二行输出从SS到DD的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

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
#include "iostream"
using namespace std;

#define Max 500
#define Sky 99999
int Graph[Max][Max],Top,Start,End,Edge;
int Dist[Max],Move[Max],Peo[Max],Sum[Max],Way[Max];

void Dis()
{
	int i,j;
	for(i=0;i<Top;i++)
	{
		Dist[i]=Graph[Start][i];
		Move[i]=false;
		if(i!=Start && Graph[Start][i]!=Sky)
		{
			Sum[i]=Peo[Start]+Peo[i];
            Way[i]=1;
		}
	}
    Dist[Start]=0;
	Move[Start]=true;
	Sum[Start]=Peo[Start];
	Way[Start]=1;

    for(i=1;i<=Top-2;i++)
	{
		int minw,maxp;
		minw=maxp=Sky;
		int k=Start;

		for(j=0;j<Top;j++)
		{
			if(!Move[j])
			{
				if(minw>Dist[j])
				{
					minw=Dist[j];
					k=j;
					maxp=Sum[j];
				}
				if(minw==Dist[j] && maxp<Sum[j])
				{
					maxp=Sum[j];
					k=j;
				}
			}
		}

		Move[k]=true;

		for(j=0;j<Top;j++)
		{
			if(!Move[j])
			{
				if(Dist[j]==Dist[k]+Graph[k][j])
				{
					Way[j]+=Way[k];
					if(Sum[j]<Sum[k]+Peo[j])
					{
						Sum[j]=Sum[k]+Peo[j];
					}
				}
				if(Dist[j]>Dist[k]+Graph[k][j])
				{
					Dist[j]=Dist[k]+Graph[k][j];
					Sum[j]=Sum[k]+Peo[j];
					Way[j]=Way[k];
				}

			}
		}
	}
}
void Dfs(int end,int Sump)
{
	if(end==Start)
	{
		return;
	}
	for(int j=0;j<Top;j++)
	{
        if(Sump-Peo[end]==Sum[j] && Dist[end]-Graph[end][j]==Dist[j])
		{
           Dfs(j,Sum[j]);
		   cout<<j<<" ";
		}
	}

}
int main( )
{   

     //freopen("1.txt","r",stdin);
     cin>>Top>>Edge>>Start>>End;
	 int i,j;
	 for(i=0;i<Top;i++)
	 for(j=0;j<Top;j++)
	 Graph[i][j]=Sky;

	 for(i=0;i<Top;i++)
	 cin>>Peo[i];

	 for(i=0;i<Edge;i++)
	 {
		 int x,y,z;
		 cin>>x>>y>>z;
		 Graph[x][y]=Graph[y][x]=z;
	 }
     Dis();
 	 cout<<Way[End]<<" "<<Sum[End]<<endl;

     Dfs(End,Sum[End]);
	 cout<<End<<endl;

	return 0;
}

时间: 2024-07-30 16:21:01

5-35 城市间紧急救援 (25分)的相关文章

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

PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队. 输入格式: 输入第一行给出4个正整数N.M.S.D,其中N(2)是城市的个数,顺便假设城市的编号为0 ~ (:M是快速道路的条数

PTA-数据结构 Dijkstra 城市间紧急救援

城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队. 输入格式: 输入第一行给出4个正整数N.M.S.D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N?1):M是快速道路的条数:S是出发地的城市编号:D是目

【PTA】L2-001 紧急救援 (25分)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图. 在地图上显示有多个分散的城市和一些连接城市的快速道路. 每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上. 当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队.输入格式: 输入第一行给出4个正整数N.M.S.D,其中N(2≤N≤500)是城市的个数 顺便假设城市的编号为0 ~ (N−1):M是快速道路的条数:S是出发地的城市编号:D是目的地的城市编号. 第二行

5-3 树的同构 (25分)

5-3 树的同构   (25分) 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数NN (\le 10≤10),即该树的结点数(此时假设结点从0到N-1N?1编号):随后NN行,第i

PTA 旅游规划(25 分)

7-10 旅游规划(25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 输入格式: 输入说明:输入数据的第1行给出4个正整数N.M.S.D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N?1):M是高速公路的条数:S是出发地的城市编号:D是目的地的城市编号.随后的M行中,每行给出一条高速公路的信息,分别

PAT 1003 Emergency (25)(25 分)

1003 Emergency (25)(25 分) As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road betwe

【PAT】1015 德才论 (25)(25 分)

1015 德才论 (25)(25 分) 宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人." 现给出一批考生的德才分数,请根据司马光的理论给出录取排名. 输入格式: 输入第1行给出3个正整数,分别为:N(<=10^5^),即考生总数:L(>=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格被

PAT 甲级 1013 Battle Over Cities (25 分)(图的遍历,统计强连通分量个数,bfs,一遍就ac啦)

1013 Battle Over Cities (25 分) It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any oth

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

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