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;
}
运行截图 :