求助
查看原帖
求助
305532
mango09楼主2021/6/14 21:30

蒟蒻在做此题时发现:

#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));

就不行。

想了半天也没有想出来是为什么,求助。

2021/6/14 21:30
加载中...