带权并查集,设f[x]为x的父亲,s[x]为sum[x]-sum[fx],路径压缩的时候记得改s
#include#include using namespace std;const int N=200005;int n,m,s[N],f[N],ans;int read(){ int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f;}int zhao(int x){ if(f[x]==x) return x; int nw=zhao(f[x]); s[x]+=s[f[x]]; return f[x]=nw;}int main(){ while(~scanf("%d%d",&n,&m)) { for(int i=0;i<=n;i++) f[i]=i,s[i]=0; ans=0; while(m--) { int x=read()-1,y=read(),z=read(),fx=zhao(x),fy=zhao(y); if(fx!=fy) { f[fy]=fx; s[fy]=s[x]-s[y]+z; } else if(s[y]-s[x]!=z) ans++; } printf("%d\n",ans); } return 0;}