#include<stdio.h>
int road[510][510],vst[510],hper[510]; //救援队伍数量
int N,M,C1,C2,shpath=-1,maxhp=-1,cnt=0;
int main(){
void dfs(int from,int len,int helpers); //函数声明
int i,j;
int c1,c2,l;
scanf("%d %d %d %d",&N,&M,&C1,&C2);
for(i=0;i<N;i++){
scanf("%d",&hper[i]); //输入救援队伍数量
vst[i]=0; //初始化访问标志数组
for(j=0;j<N;j++){
road[i][j]=-1; //二维数组存储对应边的权值
road[j][i]=-1; //初始化二维数组
}
}
for(i=0;i<M;i++){ //输入边的权值
scanf("%d %d %d",&c1,&c2,&l);
road[c1][c2]=l;
road[c2][c1]=l;
}
vst[C1]=1; //从C1开始访问
dfs(C1,0,hper[C1]);
printf("%d %d\n",cnt,maxhp); //count,找到的路径条数;maxhp,能到达的最大救援队数量
return 0;
}
void dfs(int from,int len,int helpers){
int i,j;
if(len>shpath&&shpath!=-1){
return;
}
if(from==C2){ //递归调用到底,起点即为路径终点C2
if(len<shpath||shpath==-1){ //找到一条权值更小的路径
shpath=len;
maxhp=helpers;
cnt=1;
}
else if(len==shpath){ //找到权值最小的不同路径
cnt++;
if(helpers>maxhp){
maxhp=helpers;
}
}
return;
} //递归调用到底,起点即为路径终点C2
for(i=0;i<N;i++){
if(vst[i]==0&&road[from][i]!=-1){
vst[i]=1;
dfs(i,len+road[from][i],helpers+hper[i]);
vst[i]=0; //为下一趟不同路径寻找还原vst【】数组值
}
}
}
PAT-A1003
最新推荐文章于 2020-08-22 12:24:02 发布