use dijkstral algorithm to find the shortest path whose cost is always minimum.(dynamic array version)
// 1030. Travel Plan.cpp: 主项目文件。 #include "stdafx.h" #include <cstdio> #include <cstring> #include <vector> using std::vector; const int INF=0x6fffffff; const int N=503; typedef struct Edge{ int to,dd,cc; Edge(int _to,int _dist,int _cost):to(_to),dd(_dist),cc(_cost){} }Edge; vector<Edge> edge[N]; vector<int> path[N]; int dist[N],cost[N]; bool used[N]; int citys,roads,start,finish; int findMin(){ int minf=-1,min=INF; for(int i=0;i<citys;i++){ if(!used[i]&&dist[i] <min) min=dist [i],minf=i; } return minf; } void dijkstral(){ memset(used,0,sizeof(used)); for(int i=0;i<citys;i++) dist[i]=INF; dist[start]=0; path[start].push_back(start); for(int i=0;i<citys;i++){ int minIndex=findMin(); if(minIndex==-1) return; if(minIndex==finish) return; used[minIndex]=true; typedef vector<Edge>::iterator Itr; for(Itr ite=edge [minIndex].begin();ite!=edge [minIndex].end();ite++){ if(!used[ite- >to]){ int distTemp=dist[minIndex]+ite- >dd,costTemp=cost[minIndex]+ite->cc; if (distTemp<dist[ite->to]){ dist[ite->to]=distTemp; cost[ite->to]=costTemp; path[ite->to]=path[minIndex]; path[ite->to].push_back(ite->to); } else if(distTemp==dist[ite->to]){ if(costTemp<cost[ite->to]){ cost[ite->to]=costTemp; path[ite->to]=path[minIndex]; path[ite->to].push_back(ite- >to); } } } } } } int main() { scanf("%d%d%d %d",&citys,&roads,&start,&finish); for(int i=0;i<roads;i++){ int ff,tt,dd,cc; scanf("%d%d%d %d",&ff,&tt,&dd,&cc); Edge edge1 (tt,dd,cc),edge2(ff,dd,cc); edge[ff].push_back (edge1); edge[tt].push_back (edge2); } dijkstral(); for(vector<int>::iterator ite=path[finish].begin();ite!=path [finish].end();ite++) printf("%d ",*ite); printf("%d %d\n",dist [finish],cost[finish]); return 0; }