#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int read() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
struct edge {
int to,next,v;
} e[100001];
int n,m,cnt,head[100001],d[100001];
bool mark[100001];
void ins(int u,int v,int w) {
e[++cnt]=(edge) {
v,head[u],w
};
head[u]=cnt;
}
bool spfa(int x) {
mark[x]=1;
for(int i=head[x]; i; i=e[i].next)
if(d[x]+e[i].v>d[e[i].to]) {
if(mark[e[i].to])return 1;
d[e[i].to]=d[x]+e[i].v;
if(spfa(e[i].to))return 1;
}
mark[x]=0;
return 0;
}
bool jud() {
memset(d,0,sizeof(d));
memset(mark,0,sizeof(mark));
for(int i=1; i<=n; i++)
if(spfa(i))return 1;
return 0;
}
int main() {
n=read(),m=read();
for(int i=1; i<=m; i++) {
int f=read(),a=read(),b=read(),c;
if(f==1) {
c=read();
if(a==b) {
puts("No");
return 0;
}
ins(b,a,c);
} else if(f==2) {
c=read();
if(a==b) {
puts("No");
return 0;
}
ins(a,b,-c);
} else ins(a,b,0),ins(b,a,0);
}
for(int i=n; i>0; i--)ins(0,i,1);
if(jud()) {
puts("No");
return 0;
}
puts("Yes");
return 0;
}
3436: 小K的农场 (差分约束)
最新推荐文章于 2019-01-06 18:53:00 发布