1. 程式人生 > >7-1 城市間緊急救援 (25 分)

7-1 城市間緊急救援 (25 分)

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define infinity 0xffffff
int main(){
   int n,m,s,d;
   scanf("%d %d %d %d",&n,&m,&s,&d);
   int e[520][520];
   for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            if(i==j) e[i][j]=0;
            else e[i][j]=infinity;
   int *dis=(int*)malloc(sizeof(int)*n);
   int *sum=(int*)malloc(sizeof(int)*n);
   int *coun=(int*)malloc(sizeof(int)*n);
   int *path=(int*)malloc(sizeof(int)*n);
   int *str=(int*)malloc(sizeof(int)*n);
   int *book=(int*)malloc(sizeof(int)*n);
   for(int i=0;i<n;i++) {
        scanf("%d",&str[i]);
        sum[i]=str[i];
   }
   while(m--){
        int a,b,weight;
        scanf("%d %d %d",&a,&b,&weight);
        e[a][b]=weight;
        e[b][a]=weight;
   }
   for(int i=0;i<n;i++){
        dis[i]=e[s][i];
        if(e[s][i]!=0&&e[s][i]!=infinity)
            sum[i]+=sum[s];
        book[i]=0;
        coun[i]=1;
        path[i]=-1;
   }
   book[s]=1;
   int num=n-1;
   while(num--){
        int minn=infinity,index=-1;
        for(int i=0;i<n;i++){
            if(book[i]==0&&dis[i]<minn){
                minn=dis[i];
                index=i;
            }
        }
        if(index==-1) break;
        else book[index]=1;
        for(int i=0;i<n;i++){
            if(e[index][i]<infinity){
                if(dis[i]>dis[index]+e[index][i]&&book[i]==0){
                    coun[i]=coun[index];//更新成上一條
                    sum[i]=sum[index]+str[i];
                    path[i]=index;
                    dis[i]=dis[index]+e[index][i];
                }
                else if(dis[i]==dis[index]+e[index][i]&&book[i]==0){
                    coun[i]=coun[i]+coun[index];
                    if(sum[i]<sum[index]+str[i]){
                        sum[i]=sum[index]+str[i];
                        path[i]=index;
                    }
                }
            }
        }

   }
   printf("%d %d\n",coun[d],sum[d]);
   int *road=(int*)malloc(sizeof(int)*n);
   int b=0,t=d;
   road[b++]=d;
   while(path[t]!=-1){
        road[b++]=path[t];
        t=path[t];
   }
   road[b++]=s;
   for(int i=b-1;i>=0;i--){
        if(i==b-1) printf("%d",road[b-1]);
        else printf(" %d",road[i]);
   }
   printf("\n");
}