jzoj1503-体育场【带权并查集】
生活随笔
收集整理的這篇文章主要介紹了
jzoj1503-体育场【带权并查集】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
大意
一個圓形300米的操場,外面位置無數排的椅子,然后給出一些條件,形式為:
意思為A在B的順時針方向第x個,求有多少個要求無法滿足
解題思路
用并查集,然后一個farfar數組表示離它的fatherfather有多遠,每次壓縮路徑。之后如果輸入的A和B在一個分量內就進行判斷
這樣就累加不滿足的條件。
不然就進行連接
(far[x]?far[y]+w+300)%300(far[x]?far[y]+w+300)%300
這樣計算連接之后的距離,而且防止了負數情況
代碼
#include<cstdio> #include<algorithm> using namespace std; int n,m,x,y,w,father[50001],far[50001],s; int find(int x) {if (father[x]==x) {return x;}else{int fa=father[x];father[x]=find(father[x]);far[x]=(far[x]+far[fa])%300;//壓縮路徑return father[x];} } void unionn(int x,int y,int w) {int fa=find(x),fb=find(y);father[fb]=fa;far[fb]=(far[x]-far[y]+w+300)%300;//連接兩點 } int main() {scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)father[i]=i;for (int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&w);if (find(x)==find(y)){if ((far[x]+w)%300!=far[y]) s++;//統計}elseunionn(x,y,w);//連接}printf("%d",s); }總結
以上是生活随笔為你收集整理的jzoj1503-体育场【带权并查集】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jzoj1029-电子眼【树形dp】
- 下一篇: 快速判断一台不开机的电脑电脑显示诊断你的