差分约束全是No求助
查看原帖
差分约束全是No求助
716260
SegmentTree_楼主2024/1/28 11:59
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 5e4+5;
const int inf = INT_MAX;
int head[N], cnt1, dis[N], to[N], val[N], nxt[N], cnt[N];
int n, m;
bool vis[N];
void add(int a, int b, int c){
	to[++cnt1] = b;
	val[cnt1] = c;
	nxt[cnt1] = head[a];
	head[a] = cnt1;
}
queue<int> q;
bool spfa(int s){
	for (int i = 1;i <= n;i++) dis[i] = -inf;
	dis[s] = 0;vis[s] = 1;cnt[s] = 1;q.push(s);
	while (q.size()){
		int u = q.front();
		q.pop();
		vis[u] = 0;
		for (int i = head[u];i;i = nxt[i]){
			int v = to[i];
			if (dis[v] < (ll)dis[u] + val[i]){
				dis[v] = dis[u] + val[i];
				if (!vis[v]){
					q.push(v);
					vis[v] = 1;
					++cnt[v];
					if (cnt[v] == n + 1)return 0;
				}
			}
		}
	}
	return 1;
}
int main(){ 
	cin >> n >> m;
	for (int i = 1;i <= m;i++){
		int op, a, b, c;
		cin >> op >> a >> b;
		if (op == 1){
			cin >> c;
			add(a, b, -c);
		}
		else if (op == 2){
			cin >> c;
			add(b, a, c);
		}
		else{
			add(a, b, 0);
			add(b, a, 0);
		}
	}
	for (int i = 1;i <= n;i++) add(n + 1, i, 0);
	if(spfa(n + 1)){
		//for (int i = 1;i <= n;i++) cout << dis[i] << ' ';
		cout << "Yes";
	}
	else cout << "No";
	return 0;
}
2024/1/28 11:59
加载中...