PAT-A1003

来源:互联网 发布:c语言1.0f 编辑:程序博客网 时间:2024/06/04 19:43
    #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【】数组值          }        }            }   

0 0
原创粉丝点击