#include<iostream>
#include<vector>
#include<map>
#include<queue>
using namespace std;
int node = 4; //假设有4个结点
map<string, map<string, int>> mp; //邻接矩阵
struct Road{
vector<string> link; //路线
int dis; //距离
map<string, int> visited; //用于标记走了多少结点
bool operator<(const Road& o) const { //定义结构体的优先级,(优先处理所走路径最短的)
return dis > o.dis;
}
};
Road bfs() {
priority_queue<Road> q;
string begin = "a"; //初始化起点
Road start({ {begin},0 }), minRoad;
start.visited[begin] = 1;
q.push(start);
while (!q.empty()) {
for (auto& it : mp[q.top().link.back()]) {
Road tmp = q.top(); //复制最优结点(即走的最短的结点)
tmp.dis += it.second; //向it.first移动
tmp.visited[it.first] = 1;
tmp.link.push_back(it.first);
if (minRoad.link.empty() || tmp.dis < minRoad.dis) //剪枝:当存在可选最短路径时,如果某条线路已经超出了这个距离,说明往后的距离都比此距离长,因此可以舍弃
q.push(tmp);
if (it.first == begin && tmp.visited.size() == node && (minRoad.link.empty() || tmp.dis < minRoad.dis)) //当回到原点,初始化或更新最短路线minRoad
minRoad = tmp;
}
q.pop();
}
return minRoad;
}
int main() {
mp["a"]["b"] = mp["b"]["a"] = 4;
mp["b"]["c"] = mp["c"]["b"] = 3;
mp["b"]["d"] = mp["d"]["b"] = 5;
mp["d"]["a"] = 1;
Road road = bfs();
cout <<"最短距离:"<< road.dis<<endl<<"路线:";
for (int i = 0; i < road.link.size(); i++)
cout << road.link[i] << " ";
cout << endl;
return 0;
}