并查集真心高深,偏移量的问题以及路径压缩中的更新顺序问题真心把我搞迷糊了。。。。决定先不看并查集了。。。。
code:
#include <cstdio> #include <cstring> using namespace std; class UFS { static const int MAXN = 200001; public: int father[MAXN]; int rank[MAXN]; void init(int num) { for(int i=0;i<=num;i++) { father[i]=i; rank[i]=0; } } int find(int k) { if(father[k]!=k) { int t=father[k]; father[k]=find(father[k]); rank[k]+=rank[t]; } return father[k]; } void merge(int a,int b,int x,int y,int sum) { father[y]=x; rank[y]=rank[a]-rank[b]+sum; } }ufs; int main() { int n,m,a,b,sum,i,ans; while(~scanf("%d%d",&n,&m)) { ufs.init(n); ans=0; for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&sum); a--; int x=ufs.find(a); int y=ufs.find(b); if(x!=y) { ufs.merge(a,b,x,y,sum); }else if(sum!=ufs.rank[b]-ufs.rank[a]) { ans++; //printf("%d %d %d\n",a,b,sum); } } printf("%d\n",ans); } return 0; }