【并查集】小 X 的液体混合
生活随笔
收集整理的這篇文章主要介紹了
【并查集】小 X 的液体混合
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
小 X 的液體混合
題目大意:
在一個(gè)玻璃瓶里,放入一些液體,某一對(duì)液體放在一起會(huì)有反應(yīng),當(dāng)某個(gè)液體有反應(yīng)時(shí)危險(xiǎn)度就會(huì)乘2(初值為1),問危險(xiǎn)度最大是多少
原題:
解題思路:
記錄下每一個(gè)點(diǎn)的根節(jié)點(diǎn),然后并查集,最后輸出n減去根節(jié)點(diǎn)是自己的點(diǎn)(無法產(chǎn)生反應(yīng)的),就可以了
代碼:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,m,x,y,sum,fathx,fathy,a[350],father[1005]; int fa(int dep)//并查集 {if (father[dep]==dep) return dep;//自己是根節(jié)點(diǎn)return fa(father[dep]);//往父節(jié)點(diǎn)搜 } void gjc() {int t=0;for (int i=1;i<=310;++i){a[i]=a[i]*2+t;//高精乘t=a[i]/10;a[i]%=10;} } 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",&x,&y);fathx=fa(x);//記錄根節(jié)點(diǎn)fathy=fa(y);//根節(jié)點(diǎn)father[min(fathx,fathy)]=max(fathx,fathy);//把序號(hào)小的液體記為序號(hào)大的液體的父親}for (int i=1;i<=n;++i)if (father[i]==i)//自己是根節(jié)點(diǎn)sum++;a[1]=1;//預(yù)處理for (int i=1;i<=n-sum;++i)//2的n-sum次方gjc();int k=310;//高精輸出while (!a[k]&&k>0) k--;for (int i=k;i>0;--i)printf("%d",a[i]); }總結(jié)
以上是生活随笔為你收集整理的【并查集】小 X 的液体混合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【桶排】小 X 的密码破译
- 下一篇: 初一模拟赛总结(2019.4.13)