[带权并查集] Jzoj P1503 体育场
题解
- 设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\n",ans); 33 return 0; 34 }