(PAT)1003. Emergency (25)
2014-01-08 16:15
471 查看
#include<stdio.h> #include<string.h> #define INF 1<<10 int n,m,so,ta; int cities[500+10][500+10]; int teams[500+10]; int dist[500+10]; int byPass[500+10]; int maxTeams[500+10]; int difDist[500+10]; bool visited[500+10]; int selectMin(int n) { int minCity=-1; int minDis=INF; for(int i=0;i<n;i++) { if(!visited[i]&&dist[i]<minDis) { minCity=i; minDis=dist[i]; } } if(minCity==-1)return -1; visited[minCity]=true; for(int i=0;i<n;i++) { if(i!=minCity) { if(cities[minCity][i]!=INF&&cities[minCity][i]+dist[minCity]<dist[i]) { dist[i]=cities[minCity][i]+dist[minCity]; difDist[i]=difDist[minCity]; maxTeams[i]=teams[i]+maxTeams[minCity]; byPass[i]=minCity; } else if(cities[minCity][i]!=INF&&cities[minCity][i]+dist[minCity]==dist[i]) { difDist[i]+=difDist[minCity]; if(maxTeams[i]<teams[i]+maxTeams[minCity])maxTeams[i]=teams[i]+maxTeams[minCity]; } } } return minCity; } void update(int minCity) { } int main() { int cityOne,cityTwo,distance; scanf("%d%d%d%d",&n,&m,&so,&ta); for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(i==j)cities[i][j]=0; else cities[i][j]=INF; } for(int i=0;i<n;i++) { scanf("%d",&teams[i]); } for(int i=0;i<m;i++) { scanf("%d%d%d",&cityOne,&cityTwo,&distance); cities[cityOne][cityTwo]=distance; cities[cityTwo][cityOne]=distance; } for(int i=0;i<n;i++) { if(cities[so][i]!=INF&&cities[so][i]!=0) { dist[i]=cities[so][i]; byPass[i]=so; maxTeams[i]=teams[so]+teams[i]; difDist[i]=1; }else{ byPass[i]=-1; maxTeams[i]=0; dist[i]=cities[so][i]; difDist[i]=0; } visited[i]=false; } visited[so]=true; difDist[so]=1; maxTeams[so]=teams[so]; byPass[so]=so; while(true) { int minDisCity=selectMin(n); if(minDisCity==-1)break; } printf("%d %d",difDist[ta],maxTeams[ta]); }
这题需要提一下的是:
1)核心步骤是Dijkstra算法。
2)增加两个矩阵分别存放最短路径的条数以及最大的teams。在更新dist矩阵的时候一并更新。
相关文章推荐
- PAT(甲)1003. Emergency(25)
- PAT-A-1003. Emergency (25)
- 【PAT】1003. Emergency (25)
- PAT 1003. Emergency (25)
- PAT(甲)1003. Emergency(25)
- PAT --- 1003. Emergency (25)
- PAT 1003. Emergency (25)
- pat 1003. Emergency (25)
- PAT 甲级 1003. Emergency (25)
- PAT(甲)1003. Emergency(25)
- PAT 1003. Emergency (25) 【精华】
- PAT(甲)1003. Emergency(25)
- PAT (Advanced Level) Practise - 1003. Emergency (25)
- PAT 1003. Emergency (25)---深搜
- PAT (Advanced Level) 1003. Emergency (25) 最短路径 DFS
- PAT (Advanced Level) Practise 1003. Emergency (25)
- PAT(甲)1003. Emergency(25)
- PAT 甲级-1003. Emergency (25)
- PAT(甲)1003. Emergency(25)
- PAT (Advanced Level) 1003. Emergency (25) 解题报告