7-1 城市間緊急救援 (25 分)
阿新 • • 發佈:2018-12-19
#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"); }