有点晕,关系很快就想好了,但是在getfather的时候,一开使使用tmp = father[x],但是在后面计算距离的时候没有使用tmp而是直接用了father[x],愁人!!!
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 200001+20;
int father[maxn];
int dis[maxn];
int cnt;
int getfather(int x)
{
int tmp = father[x];
if (father[x] == x)
{
return father[x];
}
father[x] = getfather(father[x]);
dis[x] = dis[x] + dis[tmp];
return father[x];
}
void merge(int a,int b,int s)
{
int fa = getfather(a);
int fb = getfather(b);
if (fa == fb)
{
if(dis[b] - dis[a] != s)
cnt++;
}
else
{
father[fb] = fa;
dis[fb] = (dis[a] + s - dis[b]);
}
}
int main(int argc, char const *argv[])
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
cnt = 0;
for (int i = 0; i <= n; ++i)
{
father[i] = i;
dis[i] = 0;
}
for (int i = 0; i < m; ++i)
{
int a,b,s;
scanf("%d%d%d",&a, &b, &s);
a--;
merge(a,b,s);
}
printf("%d\n", cnt);
}
return 0;
}