题解
- 设dis[i]为i与它父亲的距离,fa[i]表示它的父亲,读人的距离为c
- 当fa[a]==fa[b]时
- 在合法情况下:dis[a]+c=dis[b]
- 在a和b不同父亲时
- 合法情况下:fa[a]与fa[b]的距离d=dis[a]-dis[b]+c
代码
1 #include<cstdio>
2 #include<iostream>
3 #include<algorithm>
4 #include<cmath>
5 using namespace std;
6 int n,m,fa[600010],dis[600010],x,y,z,a,b,ans;
7 int find(int x)
8 {
9 if (x==fa[x]) return x;
10 int k=fa[x];
11 fa[x]=find(fa[x]);
12 dis[x]=(dis[x]+dis[k])%300;
13 return (fa[x]);
14 }
15 void insert(int x,int y,int z)
16 {
17 int u=find(x),v=find(y);
18 fa[v]=u;
19 dis[v]=(dis[x]-dis[y]+z+300)%300;
20 }
21 int main()
22 {
23 scanf("%d%d",&n,&m);
24 for (int i=1;i<=n;i++) fa[i]=i;
25 for (int i=1;i<=m;i++)
26 {
27 scanf("%d%d%d",&x,&y,&z);
28 int u=find(x),v=find(y);
29 if (u!=v) insert(x,y,z);
30 else if ((dis[x]+z)%300!=dis[y]) ans++;
31 }
32 printf("%d
",ans);
33 return 0;
34 }