本题用Dfs搜索或者Dijkstra算法都可以,当然也有其它的方法。这题感觉是pat中常见的类型,非常重要。
Dfs搜索代码:
#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;
dfs(C1,0,hper[C1]);
printf("%d %d\n",cnt,maxhp);
return 0;
}
void dfs(int from,int len,int helpers){
int i,j;
if(len>shpath&&shpath!=-1){
return;
}
if(from==C2){
if(len<shpath||shpath==-1){
shpath=len;
maxhp=helpers;
cnt=1;
}
else if(len==shpath){
cnt++;
if(helpers>maxhp){
maxhp=helpers;
}
}
return;
}
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;
}
}
}
Dijstra算法代码:
#include<stdio.h>
#define maxint 1<<28
int N,M,C1,C2;
int map[510][510],vst[510],dis[510],hel[510];
int pathcnt[510],pathhel[510];
void init(){
int i,j;
for(i=1;i<=N;i++){
vst[i]=0;
hel[i]=0;
dis[i]=maxint;
pathcnt[i]=0;
pathhel[i]=0;
for(j=1;j<=N;j++){
map[i][j]=map[j][i]=maxint;
}
}
}
void Dijstra(){
int i,j,k;
dis[C1]=0;
pathcnt[C1]=1;
pathhel[C1]=hel[C1];
for(i=1;i<=N;i++){
int imin=maxint;
for(j=1;j<=N;j++){
if(!vst[j]&&dis[j]<imin){
imin=dis[j];
k=j;
}
}
vst[k]=1;
for(j=1;j<=N;j++){
if(vst[j]==0){
if(dis[j]>dis[k]+map[k][j]){
dis[j]=dis[k]+map[k][j];
pathhel[j]=pathhel[k]+hel[j];
pathcnt[j]=pathcnt[k];
}
else if(dis[j]==dis[k]+map[k][j]){
pathcnt[j]+=pathcnt[k];
if(pathhel[j]<pathhel[k]+hel[j]){
pathhel[j]=pathhel[k]+hel[j];
}
}
}
}
if(imin==maxint||k==C2) return;
}
}
int main(){
int i,j,from,to,dist;
scanf("%d %d %d %d",&N,&M,&C1,&C2);
C1++;
C2++;
init();
for(i=1;i<=N;i++){
scanf("%d",&hel[i]);
}
for(i=1;i<=M;i++){
scanf("%d %d %d",&from,&to,&dist);
map[from+1][to+1]=map[to+1][from+1]=dist;
}
Dijstra();
printf("%d %d\n",pathcnt[C2],pathhel[C2]);
return 0;
}