PAT 1003. Emergency
2014-04-14 00:00
204 查看
摘要: 最短路径问题
#include<stdio.h> #include<vector> #include<string.h> using namespace std; #define mx 505 struct edge { int c; int len; }; vector<edge> E[mx]; int city[mx]; int dis[mx]; int visited[mx]; int ccnt[mx];//the number of different shortest path int csave[mx]; int main() { int n,m,c1,c2; scanf("%d %d %d %d",&n,&m,&c1,&c2); for(int i=0;i<mx;i++) //init { E[i].clear(); dis[i]=-1; } for(int i=0;i<n;i++){ scanf("%d",&city[i]); } for(int i=0;i<m;i++) { edge tmp; int a,b,l; scanf("%d %d %d",&a,&b,&l); tmp.len=l; tmp.c=b; E[a].push_back(tmp); tmp.c=a; E[b].push_back(tmp); } int nowP=c1; dis[nowP]=0; visited[nowP]=1; csave[nowP]=city[c1]; ccnt[nowP]=1; for(int i=0;i<n;i++) { for(int j=0;j<E[nowP].size();j++) { int tmpc=E[nowP][j].c; int d=E[nowP][j].len; if(visited[tmpc]==1) continue; if(dis[tmpc]==-1||dis[tmpc]>dis[nowP]+d) { dis[tmpc]=dis[nowP]+d; csave[tmpc]=city[tmpc]+csave[nowP]; ccnt[tmpc]=ccnt[nowP]; }else if(dis[tmpc]==dis[nowP]+d) { ccnt[tmpc]+=ccnt[nowP]; if(csave[tmpc]<city[tmpc]+csave[nowP]){ csave[tmpc]=city[tmpc]+csave[nowP]; } } } int min=123456789; for(int j=0;j<n;j++){ if(dis[j]==-1) continue; if(visited[j]==1) continue; if(dis[j]<min) { min=dis[j]; nowP=j; } } visited[nowP]=1; } printf("%d %d\n",ccnt[c2],csave[c2]); return 0; }
相关文章推荐
- libdvbpsi源码分析(四)PAT表解析/重建
- PAT配置
- 什么是端口复用动态地址转换(PAT) 介绍配置实例
- MikroTik layer7-protocol
- PAT是如何工作的
- PAT (Advanced Level) Practise 1001-1010
- 数据结构学习与实验指导(一)
- PAT Basic Level 1001-1010解题报告
- 2-06. 数列求和{PAT}
- 1004. 成绩排名 (20){PAT}
- PAT 2-05. 求集合数据的均方差
- PAT 2-06. 数列求和
- PAT 1057 Stack (30)
- PAT(Advanced Level) 1004 Counting Leaves 解题报告
- PAT(Advanced Level) 1020 Tree Traversals 解题报告
- PAT(Advance Level) 1048 Find Coins 解题报告
- PAT(Advance Level) 1007 Maximum Subsequence Sum 解题报告
- PAT 1018的陷阱
- PAT 1006的坑
- PAT_1055 world richest 多键排序