Dijkstra求最短路径模板:
①边求最短路径边求解答案
const int maxn=500;
const int INF=100000000;
int G[maxn][maxn];
int d[maxn];
bool vis[maxn];
int N;//顶点数量
void Dijkstra(int v){
/*相关数组置零*/
fill(vis,vis+maxn,false);
fill(d,d+maxn,INF);
……
/*相关元素置初值*/
d[v]=0;
……
//以下大部分相同
for(int i=0;i<N;i++){
int u=-1,min=INF;
for(int j=0;j<N;j++){
if(vis[j]==false&&d[j]<min){
u=j;
min=d[j];
}
}
if(u==-1) return ;
vis[u]=true;
for(int j=0;j<N;j++){
if(vis[j]==false&&G[u][j]!=INF){
if(d[u]+G[u][j]<d[j]){
/*相关变量 覆盖 操作*/
d[j]=d[u]+G[u][j];
……
}
else if(d[u]+G[u][j]==d[j]){
/*相关变量 累加 操作*/
……
}
}
}
}
}
dijkstra保存最短路径再求解答案
const int maxn=500;
const int INF=100000000;
int G[maxn][maxn];
int d[maxn];
bool vis[maxn];
int N;//顶点数量
vector<int> pre[maxn];
vector<int> temppath,path;
void Dijkstra(int v){
fill(vis,vis+maxn,false);
fill(d,d+maxn,INF);
d[v]=0;
for(int i=0;i<N;i++){
int u=-1,min=INF;
for(int j=0;j<N;j++){
if(vis[j]==false&&d[j]<min){
u=j;
min=d[j];
}
}
if(u==-1) return ;
vis[u]=true;
for(int j=0;j<N;j++){
if(vis[j]==false&&G[u][j]!=INF){
if(d[u]+G[u][j]<d[j]){
d[j]=d[u]+G[u][j];
pre[j].clear();
pre[j].push_back(u);
}
else if(d[u]+G[u][j]==d[j]){
pre[j].push_back(u);
}
}
}
}
}
void dfs(int v){
temppath.push_back(v);
if(v==1){//递归回到源点
//标尺判断
}
for(int i=0;i<pre[v].size();i++)
dfs(pre[v][i]);
temppath.pop_back();
return ;
}
关于第二标尺:
可以在Dijkstra算法中同时考虑,或者在Dijkstra算法中保存最短路径,再进行DFS计算第二标尺。
#参考《算法笔记》第十章