社区讨论
84pts求条
P5905【模板】全源最短路(Johnson)参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjts3ue
- 此快照首次捕获于
- 2025/11/04 08:23 4 个月前
- 此快照最后确认于
- 2025/11/04 08:23 4 个月前
CPP
#include <algorithm>
#include <iostream>
#include <queue>
#define ll long long
using namespace std;
struct Edge
{
int v;
ll w;
bool operator<(const Edge &other) const
{
return w > other.w;
}
};
vector<Edge> to[3005];
ll n, m, d[3005], dis[3005], cnt[3005];
bool inq[3005];
void SPFA()
{
queue<int> q;
d[0] = 0, inq[0] = true, q.emplace(0);
while (!q.empty())
{
int now = q.front();
inq[now] = false, q.pop();
for (auto e : to[now])
{
if (d[e.v] > d[now] + e.w)
{
d[e.v] = d[now] + e.w;
cnt[e.v] = cnt[now] + 1;
if (cnt[e.v] >= n)
{
cout << -1 << endl;
exit(0);
}
if (!inq[e.v])
{
inq[e.v] = true, q.emplace(e.v);
}
}
}
}
}
void Dijkstra(int s)
{
fill(dis + 1, dis + n + 1, 1000000000ll);
priority_queue<Edge> pq;
pq.emplace(Edge{s, 0});
while (!pq.empty())
{
int now = pq.top().v, val = pq.top().w;
pq.pop();
if (val > dis[now])
{
continue;
}
dis[now] = val;
for (auto e : to[now])
{
if (dis[now] + e.w < dis[e.v])
{
pq.emplace(Edge{e.v, dis[now] + e.w});
}
}
}
ll res = 0;
for (int i = 1; i <= n; i++)
{
res += dis[i] * i;
}
cout << res << "\n";
return;
}
ll read();
int main()
{
n = read(), m = read();
for (int i = 1; i <= m; i++)
{
int u = read(), v = read(), w = read();
to[u].emplace_back(Edge{v, w});
}
for (int i = 1; i <= n; i++)
{
to[0].emplace_back(Edge{i, 0});
}
SPFA();
for (int i = 1; i <= n; i++)
{
Dijkstra(i);
}
return 0;
}
ll read()
{
ll res = 0, w = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
{
w = -1;
}
c = getchar();
}
while (c >= '0' && c <= '9')
{
res = res * 10 + (c - '0');
c = getchar();
}
return res * w;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...