一、存储一个前驱结点
存储一种能使结点路径最短的前驱结点
最后逆着访问出一条完整最短路径
打印路径函数:
1.递归写法
2.非递归写法
二、存储所有前驱结点
存储所有能使路径最短的前驱结点
最后遍历前驱结点构成的路径树(DFS),选择最优的一条输出
vector<int> pre[MAXN]
set<int> pre[MAXN]
//set使用count(i)方法,可以查询i在set中出现的次数
if(dist[i]>dist[minId]+G[minId][i]){
dist[i]=dist[minId]+G[minId][i];
pre[i].clear();
pre[i].push_back(minId);
//重置前驱点
}else if(dist[i]==dist[minId]+G[minId][i]){
pre[i].push_back(minId);
//新增前驱点,注意Bellman_ford和SPFA中要使用set排除多次插入
}