求助差分约束
  • 板块学术版
  • 楼主凤年
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/9/18 21:05
  • 上次更新2023/10/27 10:42:54
查看原帖
求助差分约束
469309
凤年楼主2022/9/18 21:05

rt

#include <bits/stdc++.h>
#define N 5010
using namespace std;

int w, n, m, head[N];
struct node {
	int nex, to, val;
} e[N];

void add(int u, int v, int w) {
	static int tot = 0;
	e[++tot].to = v;
	e[tot].val = w;
	e[tot].nex = head[u];
	head[u] = tot;
}
bool vis[N];
int dis[N], in[N];
bool spfa(int s) {
	memset(dis, -1, sizeof(dis));
	// memset(vis, false, sizeof(vis));
	// memset(in, 0, sizeof(in));
	queue<int> q;
	dis[s] = 0;
	vis[s] = true;
	++in[s];
	q.push(s);
	while(!q.empty()) {
		int x = q.front();
		q.pop();
		vis[x] = false;
		for(int i = head[x]; i; i = e[i].nex) {
			int to = e[i].to;
			if(dis[to] < dis[x] + e[i].val) {
				dis[to] = dis[x] + e[i].val;
				if(!vis[to]) {
					q.push(to);
					vis[to] = true;
					++in[to];
					if(in[to] > n + 1)
						return true; //有负环
				}
			}
		}
	}
	return false;
}

int main() {
	scanf("%d %d", &n, &m);
	for(int i = 1, u, v, w; i <= m; ++i) {
		scanf("%d %d %d", &u, &v, &w);
		add(u, v, -w);
	}
	for(int i = 1; i <= n; ++i) add(0, i, 0);
	if(spfa(0))
		printf("NO");
	else
		for(int i = 1; i <= n; ++i) printf("%d ", dis[i]);
	return 0;
}
2022/9/18 21:05
加载中...