Code:
#include<cstdio> #include<queue> using namespace std; const int N=10000+233; const int INF=10000000; int head[N],to[N<<1],nex[N<<1],val[N<<1],vis[N],d[N]; int cnt; void add_edge(int u,int v,int c) { nex[++cnt]=head[u],head[u]=cnt; to[cnt]=v,val[cnt]=c; } int spfa(int u) { vis[u]=1; for(int v=head[u];v;v=nex[v]) { int x=to[v]; if(d[u]+val[v]<d[x]) { d[x]=d[u]+val[v]; if(vis[x]==1)return 0; if(spfa(x)==0)return 0; } } vis[u]=0; return 1; } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;++i)d[i]=INF; for(int i=1;i<=m;++i) { int Ty,a,b,c; scanf("%d%d%d",&Ty,&a,&b); if(Ty!=3)scanf("%d",&c); if(Ty==1) add_edge(a,b,-c); if(Ty==2) add_edge(b,a,c); if(Ty==3) { c=0; add_edge(b,a,c); add_edge(a,b,-c); } } int ans=1; for(int i=1;i<=n;++i) { if(vis[i]==0) if(!spfa(i)) { ans=0;break; } } if(ans==0)printf("No"); else printf("Yes"); return 0; }