城市为结点;
公路为边:权重1:距离。权重2:收费。
单源最短路:Dijkstra-距离。等距离按时收费更新。
核心算法:
void Dijkastra(Vertex s) { while(1){ V=未收录顶点中dist最小值; if(这样的V不存在) break; collection[V]=true; for(V的每个邻接点) if(collection[W]==false) if(dist[V]+E<V,W><dist[w]) { dist[W]=dist[V]+E<V,W>; path[W]=V; cost[W]=cost[V]+c<V,W>;} else if((dist[V]+E<V,W>==dist[W])&&(cost[V]+c<V,W><cost[W])) { cost[W]=cost[v]+c<V,W>; path[W]=V;} } }
其他类似问题
要求数最短路径有多少条
- count[s]=1;
- 如果找到更短路:count[w]=count[v];
- 如果找到等长路:count[w]+=count[v];
要求边数更少的最短路
- count[s]=0;
- 如果找到更短路:count[w]=count[v]+1;
- 如果找到等长路:count[w]=count[v]+1;