#include
#include
#include
using namespace std;#if 0
using uint = unsigned int;
const uint INF = INT_MAX;#if 0
int Dijkstra(vector<vector<uint>>& graph,int start, int end)
{const int N = graph.size();vector<uint> dis(N, 0);vector<bool> use(N, false);use[start] = true;for (int i = 0; i < N; i++){dis[i] = graph[start][i];}for (int i = 1; i < N; i++) {int k = -1;int min = INF;for (int j = 0; j < N; j++) {if (!use[j] && min > dis[j]) {min = dis[j];k = j;}}if (k == -1){break;}use[k] = true;for (int j = 0; j < N; j++){if (!use[j] && min + graph[k][j] < dis[j]) {dis[j] = min + graph[k][j];}}}for (int d : dis){cout << d << " ";}cout << endl;return dis[end];
}
#endif
int Dijkstra(vector<vector<uint>>& graph,int start, int end)
{const int N = graph.size();vector<uint> dis(N, 0);vector<bool> use(N, false);priority_queue<pair<uint, int>, vector<pair<uint, int>>, greater<pair<uint, int>>> que;use[start] = true;for (int i = 0; i < N; i++){dis[i] = graph[start][i];if (i != start){que.emplace(graph[start][i], i);}}while (!que.empty()) {auto pair = que.top();que.pop();if (pair.first == INF){break;}int k = pair.second;int min = pair.first;if (use[k]) continue;use[k] = true;for (int j = 0; j < N; j++){if (!use[j] && min + graph[k][j] < dis[j]) {dis[j] = min + graph[k][j];que.emplace(dis[j], j);}}}for (int d : dis){cout << d << " ";}cout << endl;return dis[end];
}int main()
{vector<vector<uint>> graph ={{0, 6, 3, INF, INF, INF},{6, 0, 2, 5, INF, INF},{3, 2, 0, 3, 4, INF},{INF, 5, 3, 0, 2, 3},{INF, INF, 4, 2, 0, 5},{INF, INF, INF, 3, 5, 0},};int distance = Dijkstra(graph, 0, 1);if (distance == INF){cout << "不存在有效路径!" << endl;}else{cout << "distance:" << distance << endl;}
}
#endif
#include
#include
using namespace std;using uint = unsigned int;
const uint INF = INT_MAX;int main()
{vector<vector<uint>> graph ={{0, 6, 3, INF, INF, INF},{6, 0, 2, 5, INF, INF},{3, 2, 0, 3, 4, INF},{INF, 5, 3, 0, 2, 3},{INF, INF, 4, 2, 0, 5},{INF, INF, INF, 3, 5, 0},};for (int k = 0; k < graph.size(); k++){for (int i = 0; i < graph.size(); i++){for (int j = 0; j < graph.size(); j++){graph[i][j] = min(graph[i][j], graph[i][k]+graph[k][j]);}}}for (auto line : graph){for (auto dis : line){cout << dis << " ";}cout << endl;}
}
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!