今天发现一个大秘密!关于合并函数,此题题意很鬼,1--300列没有明确说明是什么东西,然而是否考虑%300都可以A,奇葩题。
#include<cstdio>
#include<cstring>
#define maxl 50010
#define mod 300
int n,m,cnt,ans;
int dis[maxl],f[maxl];
void prework()
{
cnt=0;ans=0;
for(int i=1;i<=n;i++)
f[i]=i,dis[i]=0;
}
int find(int x)
{
int t;
if(f[x]!=x)
{
t=f[x];
f[x]=find(f[x]);
dis[x]+=dis[t];
}//每次压缩路径到根节点,由于根节点权值是0
//所以每次加上根节点的权值不会变!
return f[x];
}
void mainwork()
{
int x,y,xx,yy,l;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&l);
xx=find(x);yy=find(y);
if(xx==yy)
{
if(dis[y]-dis[x]!=l)
ans++;
}
else
{
f[yy]=xx;
dis[yy]=dis[x]+l-dis[y];
}
/* for(int i=1;i<=n;i++)
printf("%d ",dis[i]);
puts(""); */
}
}
void print()
{
printf("%d\n",ans);
}
int main()
{
/* freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
*/ while(~scanf("%d%d",&n,&m))
{
prework();
mainwork();
print();
}
return 0;
}