求大佬帮忙把代码中一些可以把 long long 替换成 int 的部分,降一下时间复杂度和常数。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll
const ll N = 3e3 + 10, M = 2e4 + 10, INF = 1e9;
struct node
{
ll id, dis;
bool operator <(const node &x) const
{
return dis > x.dis;
}
};
ll n, m;
ll tot, ne[M], e[M], h[N], w[M], dis[N], sla[N], cnt;
ll dist[N];
bool st[N];
priority_queue<node> qdij;
queue<ll> q;
inline void dij(ll s)
{
memset(st, 0, sizeof st);
for(rl i=1;i <= n; ++ i) dist[i] = INF;
dist[s] = 0;
qdij.push({s, dis[s]});
while(qdij.size())
{
node asd = qdij.top();
qdij.pop();
ll u = asd.id;
if(st[u]) continue;
st[u] = 1;
for(rl i=h[u]; ~i; i = ne[i])
{
ll v = e[i];
if(dist[v] > dist[u] + w[i])
{
dist[v] = dist[u] + w[i];
qdij.push({v, dist[v]});
}
}
}
}
inline bool spfa()
{
memset(st, 0, sizeof st);
memset(dis, 0x3f, sizeof dis);
dis[0] = 0;
q.push(0);
while(q.size())
{
ll u = q.front();
q.pop();
st[u] = false;
for(rl i=h[u]; ~i; i = ne[i])
{
ll v = e[i];
if(dis[v] > dis[u] + w[i])
{
dis[v] = dis[u] + w[i];
if(!st[v])
{
st[v] = 1, q.push(v);
if(++ sla[v] > n) return false;
}
}
}
}
return true;
}
inline void add(ll a, ll b, ll c)
{
ne[++tot] = h[a], h[a] = tot, e[tot] = b, w[tot] = c;
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof h);
for(rl i=1;i <= m; ++ i)
{
ll a, b, c;
cin >> a >> b >> c;
add(a, b, c);
}
for(rl i=1;i <= n; ++ i)
add(0, i, 0);
bool flag = spfa();
if(!flag)
{
cout << "-1" << endl;
return 0;
}
for(rl i=1; i <= n; ++ i)
for(rl j=h[i]; ~j; j = ne[j])
w[j] += dis[i] - dis[e[j]];
for(rl i=1; i<= n; ++ i)
{
dij(i);
ll ans = 0;
for(rl j=1; j <= n; ++ j)
{
if(dist[j] == INF) ans += j * INF;
else ans += j * (dist[j] + dis[j] - dis[i]);
}
cout << ans << endl;
}
return 0;
}