PAT甲级1003(C++)

PAT1003 Emergency(c++实现)—甲级真题


你作为一个城市的领导人,拥有一张特殊的国家地图。地图上显示了每个城市的道路,当某个城市需要能源时,你需要引导你的手下尽快的去输送能源给需要的城市,你的手下也要尽可能的多


输入格式:

对于输入用例,第一行有四个整型变量。N(<=500)表示城市的数量(城市编号从0toN-1),M(道路数量)C1(当前所在城市)C2(你需要去的城市)第二行有N个整型,第i个整型的值表示在第i个城市救援队的数量。接下来M行,每行有三个整型c1,c2 and L分别表示城市c1,城市c2以及c1与c2之间的距离


输出格式:

有一行包含两个整数:第一个数字是从C1到C2的不同最短路径的数量 第二个数字是你能聚集的最大的救援队数量




分析 :

每次找出C1(起始城市)到另外一个距离最短的城市,比较当前的边权是否小于之前的边权,如果是则更新边权。



代码如下 :


#include<iostream>
#define Maxn 10000
using namespace std;
int map[500][500]={0};
int main(){
	int N,M,C1,C2;
	cin>>N>>M>>C1>>C2;
	int rescue[N];
	int Point[N]={0};//点权 
	int value[N];//C1城市到其他城市的距离 
	bool S[N]={false};//S集合用来判断已经走过的点 
	int	line[N]={0};//记录C1到其他城市最短距离的条数 
	for(int i=0;i<N;++i){
		cin>>rescue[i];
	}
	for(int i=0;i<N;++i){
		for(int j=0;j<N;++j){//初始化邻接矩阵 
			if(i==j)
			map[i][j]=0;
			else
			map[i][j]=Maxn;
		}
		if(i==C1){
			//起点到自己的路线的条数
			line[i]=1; 
			//起点的边权(自己到自己的距离)为0 
			value[i]=0;
			//起点的点权为该城市救援队的数量 
			Point[i]=rescue[i];
		}
		else{
			//起点到其他点的边权都设置为最大值 
			value[i]=Maxn;
		} 
	}
	for(int i=0;i<M;++i){
		int c1,c2,l;
		cin>>c1>>c2>>l;
		map[c1][c2]=l;
		map[c2][c1]=l;
	}
	while(1){
		int t=Maxn,temp=-1;//t为临时边权值,temp为当前的临时点 
		for(int i=0;i<N;++i){
			if(S[i]==true)
			continue;
			if(value[i]<t){
				t=value[i]; 
				temp=i;//找到边权最小的点
			}
		}
		if(t==Maxn||temp==C2)break;
		S[temp]=true;
		for(int i=0;i<N;++i){
			if(S[i]==true)//排除自己这个点
			continue;
			if(value[i]>value[temp]+map[temp][i]){//如果当前的边权小于之前的边权,更新边权,点权和路线条数
				value[i]=value[temp]+map[temp][i];//边权等于上一个点的边权加上当前边的距离(即point到i的距离)
				Point[i]=Point[temp]+rescue[i];//点权等于上一个点的点权加上当前点的点权(即当前点的救援队数量)
				line[i]=line[temp];//更新最短路径数 
			}else if(value[i]==value[temp]+map[temp][i]){
				if(Point[i]<Point[temp]+rescue[i]){
					Point[i]=Point[temp]+rescue[i];
				}
				line[i]=line[i]+line[temp];
			}
		}
	}
	cout<<line[C2]<<" "<<Point[C2];
	return 0;
} 

运行截图 :

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博&人&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值