pat刷题记录
Travel Plan (30)
Dijkstra求最短路径方法
首先找出所有点中的最小点逐次更新各点之间的最短距离,并以一个数组存储
int dist[505];
//用来存储各点最小距离
int past[505];
int dist1[505][505];//用来存储邻接矩阵
int cost1[505][505]; //存储各段之间的花销
bool visit[505];//用来存储是否有被访问过
int cost[505]; //存储总花销
int m,n,c,d;
void djst()
{
while(!visit[d]) //直到访问到目的终点为止
{
int v=-1;
int min=init_max;
for(int i=0;i<m;i++)
if(!visit[i]&&dist[i]<min) //选取未被访问过的最小距离的点
{ min=dist[i];
v=i;
}
if(v==-1) //证明所有点都访问过了或者图不连通,那么退出
return;
visit[v]=true;
for(int i=0;i<m;i++) //使用新被选取的点,对所有的距离进行更新
if(!visit[i]&&dist[i]>dist[v]+dist1[v][i]&&dist1[v][i]!=0)
{
dist[i]=dist[v]+dist1[v][i];
cost[i]=cost[v]+cost1[v][i];
past[i]=v; //存储当前最小距离的前驱节点,方便之后的输出
}
else if(!visit[i]&&dist[i]==dist[v]+dist1[v][i]&&cost[i]>cost[v]+cost1[v][i] &&dist1[v][i]!=0)
{
cost[i]=cost[v]+cost1[v][i]; //路径相同就存储花费最小
past[i]=v;
} }}