P1993 小 K 的农场

//https://www.luogu.com.cn/problem/P1993
#include <bits/stdc++.h>
using namespace std;
const int N=5e3+100,M=N*2;
int head[N],to[M],weight[M],cnt,Next[M];
int dist[N],update[N];
bool enter[N];
int h,t;
int q[N];
int n,m;
void prepare(){
	h=t=0;
	cnt=1;
	memset(head,0,sizeof head);
	memset(dist,0x3f,sizeof dist);
	memset(update,0,sizeof update);
	memset(enter,false,sizeof enter);
}
void addEdge(int u,int v,int w){
	Next[cnt]=head[u];
	to[cnt]=v;
	weight[cnt]=w;
	head[u]=cnt++;
}
bool spfa(int s){
	dist[s]=0;
	update[s]=1;
	enter[s]=true;
	q[t]=s;
	t=(t+1)%N;
	while(h!=t){
		int u=q[h];
		h=(h+1)%N;
		enter[u]=false;
		for(int ei=head[u];ei;ei=Next[ei]){
			int v=to[ei],w=weight[ei];
			if(dist[v]>dist[u]+w){
				dist[v]=dist[u]+w;
				if(!enter[v]){
					if(++update[v]>n) return true;
					q[t]=v;
					t=(t+1)%N;
					enter[v]=true;
				}
			}
		}
	}
	return false;
}
int main(){
	scanf("%d%d",&n,&m);
	prepare();
	for(int i=1;i<=n;i++) addEdge(0,i,0);
	for(int i=1,type,u,v;i<=m;i++){
		scanf("%d",&type);
		if(type==1){
			int w;
			scanf("%d%d%d",&u,&v,&w);
			addEdge(u,v,-w);
		}else if(type==2){
			int w;
			scanf("%d%d%d",&u,&v,&w);
			addEdge(v,u,w);
		}else{
			scanf("%d%d",&u,&v);
			addEdge(v,u,0),addEdge(u,v,0);
		}
	}
	if(spfa(0)) puts("No");
	else puts("Yes");
	return 0;
}

posted @ 2025-04-26 20:10  九三青梧  阅读(7)  评论(0)    收藏  举报