PAT 1018
题目其实很简单,只要用DFS就可以了,但是我的程序出来5,7两个测试出错,大神看看哪里的问题。
#include <stdio.h>
#define ABS(a) (a>=0?a:-a)
int cmax,nstats,sp,m,min,mintime;
int map[510][510];
int current[510];
int visit[510],road[510],mroad[510];
void dfs(int s,int mtime,int bikes){
int mt=mtime,bi=bikes,i;
if(mtime>mintime)
return;
if(s==sp ){//到达sp点
if(mtime<mintime){//路径更短
min=bikes;
mintime=mtime;
for(i=1;i<510;i++)
mroad[i]=road[i];
}else if(mtime==mintime){//路径相等
if(ABS(bikes)<ABS(min)){//哪个需要带更少的车选哪个
min=bikes;
for(i=1;i<510;i++)
mroad[i]=road[i];
}
}
}else{
for(i=1;i<=nstats;i++){
if(!visit[i] && map[s][i]!=-1){
visit[i]=1;
mtime += map[s][i];
bikes += cmax/2-current[i];
road[i]=s;
dfs(i,mtime,bikes);
mtime = mt;
bikes = bi;
visit[i]=0;
}
}
}
}
void printroad(int s){
if(s==0)
printf("0");
else{
printroad(mroad[s]);
printf("->%d",s);
}
}
int main(){
int i,j;
int from,to,t;
for(i=0;i<510;i++){
visit[i]=0;
road[i]=mroad[i]=-1;
for(j=0;j<510;j++)
map[i][j]=map[j][i]=-1;
}
scanf("%d %d %d %d",&cmax,&nstats,&sp,&m);
for(i=1;i<=nstats;i++)
scanf("%d",¤t[i]);
for(i=0;i<m;i++){
scanf("%d %d %d",&from,&to,&t);
map[from][to]=map[to][from]=t;
}
mintime=min=1000000;
visit[0]=1;
dfs(0,0,0);
if(min>=0){
printf("%d ",min);
printroad(sp);
printf(" 0\n");
}else{
printf("0 ");
printroad(sp);
printf(" %d\n",-min);
}
return 0;
}