题目显然是判断若干个不等式是否都成立
差分约束。直接用SPFA搞。
不过复杂度不好说。
但是我们可以换个数据结构
用带权并查集维护每个节点到父节点的路径长度。
长度的意义是sum[u]-sum[fa[u]],于是若同根则可以算出两节点长度,与当前信息比较判断。不同根就合并,维护长度。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100+5;
int pa[N],dis[N];
int find(int x){
if(x==pa[x])return x;
int tmp=find(pa[x]);
dis[x]+=dis[pa[x]];
return pa[x]=tmp;
}
bool merge(int u,int v,int w){
int x=find(u),y=find(v);
if(x==y)return dis[u]-dis[v]==w;
else{
pa[x]=y;
dis[x]=w+dis[v]-dis[u];
return true;
}
}
int main(){
//freopen("a.in","r",stdin);
int T;scanf("%d",&T);
while(T--){
int n,m;scanf("%d%d",&n,&m);
memset(dis,0,sizeof(dis));
for(int i=0;i<=n;i++)pa[i]=i;
bool flag=true;
while(m--){
int s,t,v;scanf("%d%d%d",&s,&t,&v);
if(!flag)continue;
flag&=merge(t,s-1,v);
}
puts(flag?"true":"false");
}
return 0;
}