luogu 2294 [HNOI2005]狡猾的商人 差分约束
一个差分约束模型,只需判一下有没有负环即可.
#include <bits/stdc++.h> #define N 103 #define M 2004 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int edges; int hd[N],to[M],nex[M],val[M],d[N],vis[N]; void add(int u,int v,int c) { nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c; } int spfa(int u) { vis[u]=1; for(int i=hd[u];i;i=nex[i]) { int v=to[i]; if(d[v]>d[u]+val[i]) { if(vis[v]) return 1; else { d[v]=d[u]+val[i]; if(spfa(v)) return 1; } } } vis[u]=0; return 0; } void work() { memset(d,0x3f,sizeof(d)); int n,m,i,j; scanf("%d%d",&n,&m); for(i=1;i<=m;++i) { int a,b,c; scanf("%d%d%d",&a,&b,&c); ++b; add(a,b,c), add(b,a,-c); } int flag=0; for(i=1;i<=n+1;++i) { if(!vis[i]) { d[i]=0; flag=spfa(i); if(flag) { printf("false\n"); break; } } } if(!flag) { printf("true\n"); } edges=0; memset(hd,0,sizeof(hd)); memset(vis,0,sizeof(vis)); memset(d,0,sizeof(d)); } int main() { int T,i,j; // setIO("input"); scanf("%d",&T); for(i=1;i<=T;++i) work(); return 0; }