朴素
堆优化
void solve()
{
int n, m;
cin >> n >> m;
vector<int> v(n + 1);
// 要建立有向边
vector adj(n + 1, vector<pair<int, int>>());
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
adj[u].emplace_back(w, v);
}
// 1 和 n 分别做源点 跑dij
vector minDist(n + 1, vector<int>(n + 1, LLONG_MAX));
for (int i = 1; i <= n; i++)
{
minDist[i][i] = 0;
}
auto dij = [&](int u, int fa) -> void
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
// 按照 {边,中继点} 存储 遍历到这个点的时候 查找它的儿子
// 进行松弛操作
for (auto [w, v] : adj[u])
{
pq.push({w, v});
minDist[u][v] = w; // 初始化
}
while (pq.size())
{
auto [curw, curv] = pq.top();
pq.pop();
// 我需要跑堆优化的dij
for (auto [w, v] : adj[curv])
{
if (curw + w < minDist[u][v])
{
minDist[u][v] = curw + w;
pq.push({minDist[u][v], v});
}
}
}
};
dij(1, 0);
dij(n, 0);
for (int i = 1; i <= n; i++)
{
cout << minDist[1][i] << ' ' << minDist[n][i] << endl;
}
}