24分求助
查看原帖
24分求助
167697
BartAllen楼主2023/1/21 17:06
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 3e3 + 5;
const int M = 6e3 + 5;
const int inf = 1e9;

struct edge{
	int v, w, next;
} e[M];

struct node {
	int dis, id;
	bool operator < (const node &a) const {
		return dis > a.dis;
	}
	node (int d, int x) {
		dis = d, id = x;
	}
};

int head[N], vis[N], t[N];
int n, m, cnt;
ll h[N], dis[N];

void add(int x, int y, int z) {
	e[++cnt].v = y, e[cnt].w = z, e[cnt].next = head[x], head[x] = cnt;
}

bool spfa(int start) {
	memset(vis, 0, sizeof(vis));
	memset(h, 63, sizeof(h));
	queue<int> q;
	h[start] = 1, vis[start] = 0;
	q.push(start);
	while (!q.empty()) {
		int x = q.front(); q.pop();
		vis[x] = 0;
		for (int i = head[x]; i; i = e[i].next) {
			int y = e[i].v, z = e[i].w;
			if (h[y] > h[x] + z) {
				h[y] = h[x] + z;
				if (!vis[y]) {
					vis[y] = 1, q.push(y), t[y]++;
					if (t[y] == n + 1) return false;
				}
			}
		}
	}
	return true;
}

void dijkstra(int start) {
	priority_queue<node> q;
	for (int i = 1; i <= n; i++) dis[i] = inf;
	memset(vis, 0, sizeof(vis));
	dis[start] = 0;
	q.push(node(0, start));
	while (!q.empty()) {
		int x = q.top().id; q.pop();
		if (vis[x]) continue;
		for (int i = head[x]; i; i = e[i].next) {
			int y = e[i].v, z = e[i].w;
			if (dis[y] > dis[x] + z) {
				dis[y] = dis[x] + z;
				if (!vis[y]) q.push(node(dis[y], y));
			}
		}
	}
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; i++) {
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		add(x, y, z);
	}
	for (int i = 1; i <= n; i++) add(0, i, 0);
	if (!spfa(0)) {
		printf("-1\n");
		return 0;
	}
	for (int i = 1; i <= n; i++)
		for (int j = head[i]; j; j = e[j].next) e[j].w += h[i] - h[e[j].v];
	for (int i = 1; i <= n; i++) {
		dijkstra(i);
		ll ans = 0;
		for (int j = 1; j <= n; j++) {
			if (dis[j] == inf) ans += j * inf;
			else ans += j * (dis[j] + h[j] - h[i]);
		}
		printf("%d\n", ans);
	}
	return 0;
}
2023/1/21 17:06
加载中...