#include <iostream>
#include <vector>
#include <queue>
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 <iostream>
#include <vector>
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;
}
}