蒟蒻差分约束11分求助!调了好久了QwQ(悬关)(样例可过)
查看原帖
蒟蒻差分约束11分求助!调了好久了QwQ(悬关)(样例可过)
804607
rainygame楼主2023/5/3 18:27
#include <bits/stdc++.h>
using namespace std;
#define MAXN 101

int T, n, m, u, v, w;
bool flag;

struct Edge{
	int v, w;
};
vector<Edge> e[MAXN];
int dis[MAXN], cnt[MAXN];
bitset<MAXN> vis;
queue<int> que;

bool spfa(int s){
	que.push(s);
	dis[s] = 0;
	vis[s] = true;
	cnt[s] = 1;
	
	while (!que.empty()){
		u = que.front();
		que.pop();
		vis[u] = false;
		for (auto i: e[u]){
			v = i.v;
			w = i.w;
			if (dis[v] > dis[u] + w){
				dis[v] = dis[u] + w;
				if (!vis[v]){
					cnt[v]++;
					que.push(v);
					vis[v] = true;
					if (cnt[v] > n) return false;
				}
			}
		}
	}
	
	return true;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> T;
	
	while (T--){
		cin >> n >> m;
		for (int i=1; i<=n; i++) e[i].clear();
		while (m--){
			cin >> u >> v >> w;
			e[u-1].push_back({v, w});
			e[v].push_back({u-1, -w});
		}
		
		memset(dis, 0x3f, sizeof(dis));
		memset(cnt, 0, sizeof(cnt));
		vis.reset();
		while (!que.empty()) que.pop();
		
		flag = 0;
		for (int i(0); i<=n; ++i){
			if (!cnt[i] && !spfa(i)){
				flag = 1;
				break;
			}
		}
		
		cout << (flag ? "false" : "true") << '\n';
	}
	
	return 0;
}
2023/5/3 18:27
加载中...