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;
}