蒟蒻在做此题时发现:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define int long long
using namespace std;
const int MAXN = 3e3 + 5;
const int MAXM = 1e4 + 5;
const int INF = 1e9;
int n, m, cnt;
int head[MAXN], h[MAXN], inq[MAXN], dis[MAXN];
bool vis[MAXN];
struct edge
{
int to, dis, nxt;
}e[MAXM];
void add(int u, int v, int w)
{
e[++cnt] = edge{v, w, head[u]};
head[u] = cnt;
}
bool spfa()
{
queue<int> q;
memset(h, 0x3f, sizeof(h));
h[0] = 0;
q.push(0);
while (!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
for (int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to, w = e[i].dis;
if (h[v] > h[u] + w)
{
h[v] = h[u] + w;
if (!vis[v])
{
vis[v] = true;
q.push(v);
if (++inq[v] > n)
{
return true;
}
}
}
}
}
return false;
}
struct que
{
int from, dis;
bool operator <(const que &x)const
{
return x.dis < dis;
}
};
void dijkstra(int s)
{
priority_queue<que> pq;
for (int i = 1; i <= n; i++)
{
dis[i] = INF;
vis[i] = false;
}
dis[s] = 0;
pq.push(que{s, 0});
while (!pq.empty())
{
int u = pq.top().from;
pq.pop();
if (vis[u])
{
continue;
}
vis[u] = true;
for (int i = head[u]; i; i = e[i].nxt)
{
int v = e[i].to, w = e[i].dis;
if (dis[v] > dis[u] + w && !vis[v])
{
dis[v] = dis[u] + w;
pq.push(que{v, dis[v]});
}
}
}
}
signed main()
{
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%lld%lld%lld", &u, &v, &w);
add(u, v, w);
}
for (int i = 1; i <= n; i++)
{
add(0, i, 0);
}
if (spfa())
{
printf("-1");
return 0;
}
for (int i = 1; i <= n; i++)
{
for (int j = head[i]; j; j = e[j].nxt)
{
e[j].dis += h[i] - h[e[j].to];
}
}
for (int i = 1; i <= n; i++)
{
dijkstra(i);
int ans = 0;
for (int j = 1; j <= n; j++)
{
if (dis[j] == INF)
{
ans += j * INF;
}
else
{
ans += j * (dis[j] - h[i] + h[j]);
}
}
printf("%lld\n", ans);
}
return 0;
}
若将其中 dijkstra 部分中的
for (int i = 1; i <= n; i++)
{
dis[i] = INF;
vis[i] = false;
}
改为
memset(dis, INF, sizeof(dis));
memset(vis, false, sizeof(vis));
就不行。
想了半天也没有想出来是为什么,求助。