【PAT甲级】【C++】1003. Emergency (25)

来源:互联网 发布:vmware pro mac os x 编辑:程序博客网 时间:2024/05/20 14:41
#include<cstdio>//#include<limits>#define INF 0x7FFFFFFF#define MAX 500int dis[MAX];int teams[MAX];int paths[MAX];int call[MAX];int map[MAX][MAX];bool visited[MAX];int n,m,start,end;void dijkstra(int s){dis[s]=0;call[s]=teams[s];visited[s]=true;int p=s;while(p!=end){for(int i=0;i<n;i++){if(visited[i]==false){if(dis[i]>dis[p]+map[p][i]){dis[i]=dis[p]+map[p][i];call[i]=call[p]+teams[i];paths[i]=paths[p];}else if(dis[i]==dis[p]+map[p][i]){paths[i]+=paths[p];if(call[i]<call[p]+teams[i])call[i]=call[p]+teams[i];}}}int dismin=INF;for(i=0;i<n;i++)if(visited[i]==false&&dis[i]<dismin){dismin=dis[i];p=i;}visited[p]=true;}}int main(){scanf("%d%d%d%d",&n,&m,&start,&end);for(int i=0;i<n;i++){scanf("%d",&teams[i]);}for(i=0;i<n;i++){dis[i]=INF;paths[i]=1;visited[i]=false;for(int j=0;j<n;j++)map[i][j]=INF;}for(i=0;i<m;i++){int c1,c2,L;scanf("%d%d%d",&c1,&c2,&L);map[c1][c2]=map[c2][c1]=L;}dijkstra(start);printf("%d %d\n",paths[end],call[end]);return 0;}

0 0