[帶權並差集] Jzoj P1503 體育場
阿新 • • 發佈:2018-07-09
現在 png pan namespace str main find mat fix
題解
- 設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 }
[帶權並差集] Jzoj P1503 體育場