Luogu1993小K的农场

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

int n,m,cnt,head[100005],vis[100005],dis[100005];

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

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

inline bool spfa(int u){
	vis[u]=1;
	for(int i=head[u];i!=-1;i=e[i].next){
		int v=e[i].v;
		if(dis[v]<dis[u]+e[i].w){
			dis[v]=dis[u]+e[i].w;
			if(vis[v])return 0;
			if(!spfa(v))return 0;
		}
	}
	vis[u]=0;
	return 1;
}

int main(){
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int flag,a,b,c;
		scanf("%d",&flag);
		if(flag==1){
			scanf("%d%d%d",&a,&b,&c);
			add(a,b,-c);
		}
		else if(flag==2){
			scanf("%d%d%d",&a,&b,&c);
			add(b,a,c);
		}
		else{
			scanf("%d%d",&a,&b);
			add(a,b,0);add(b,a,0);
		}
	}
	for(int i=1;i<=n;i++){
		add(0,i,0);
		dis[i]=-2147483647;
	}
	if(spfa(0))printf("Yes\n");
	else printf("No\n");
}
posted @ 2019-06-09 10:15  Y15BeTa  阅读(114)  评论(0编辑  收藏  举报