(并查集)Wireless Network
問題:
地震發生在東南亞。 ACM(亞洲合作醫療團隊)已經與膝上電腦建立了無線網絡,但是一次意外的余震襲擊,網絡中的所有計算機都被打破了。計算機一個接一個地修復,網絡逐漸開始工作。由于硬件限制,每臺計算機只能直接與距離它不遠的計算機進行通信。但是,每臺計算機都可以被視為兩臺計算機之間通信的中介,也就是說,如果計算機A和計算機B可以直接通信,或者計算機C可以與A和b進行通信,則計算機A和計算機B可以進行通信。
在修復網絡的過程中,工作人員可以隨時進行兩種操作,修復計算機或測試兩臺計算機是否可以通信。你的工作是回答所有的測試操作。
輸入
第一行包含兩個整數N和d(1 <= N <= 1001,0 <= d <= 20000)。這里N是計算機的數量,編號從1到N,D是兩臺計算機可以直接通信的最大距離。在接下來的N行中,每行包含兩個整數xi,yi(0 <= xi,yi <= 10000),這是N臺計算機的坐標。從第(N + 1)行到輸入結束,有一些操作,這些操作是一個接一個地執行的。每行包含以下兩種格式之一的操作:
1.“O p”(1 <= p <= N),表示修復計算機p。
2.“S p q”(1 <= p,q <= N),這意味著測試計算機p和q是否可以通信。
輸入不會超過300000行。
產量
對于每個測試操作,如果兩臺計算機可以通信則打印“SUCCESS”,否則打印“FAIL”。
Sample Input
(注意0和o啊。。)
Sample Output
FAIL
SUCCESS
分析與解答:
我一開始沒讀懂提,1和2和4修好了,那2可以與3連,4可以與3連為啥1和四不能連?后來我明白了,修好的電腦能連與他距離小于等于d的修好的電腦。而不是說小于d的電腦都能與之連。就是說,可以通信的計算機一定都是已經修好的計算機,而且兩臺修好的計算機的距離還必須小于等于給定的那個距離。
編號從1-n,只不過這里的電腦多了個坐標,多了個距離的判斷。
并查集里放的是相連的電腦編號,最后找也是找電腦編號的根
代碼參考:https://blog.csdn.net/superxtong/article/details/51875835
#include<cstdio> #include<cstring> int pre[10100 ]; int find(int x) //查找根節點 { int r=x;while ( pre[r] != r ) //返回根節點 rr=pre[r];int i=x , j ;while( i != r ) //路徑壓縮{j = pre[ i ]; //j是i的原來的父結點 pre[ i ]= r ; //現在把i的父結點改成根節點 i=j; //再把j的父節點改成根節點 }return r ; } void join(int x,int y) //判斷x y是否連通,//如果已經連通,就不用管了 如果不連通,就把它們所在的連通分支合并起, {int fx=find(x),fy=find(y);if(fx!=fy)pre[fx ]=fy; } struct xyz{int x;int y; }; xyz a[10086]; int flag[10086]; int main(){memset(flag,0,sizeof(flag));int n,d;scanf("%d%d",&n,&d);for(int i=1;i<=n;++i){pre[i]=i;scanf("%d%d",&a[i].x,&a[i].y);}char ch;while(scanf(" %c",&ch)!=EOF){if(ch=='O'){int k;scanf("%d",&k);flag[k]=1;for(int i=1;i<=n;i++){if(flag[i]&&i!=k){if((a[i].x-a[k].x)*(a[i].x-a[k].x)+(a[i].y-a[k].y)*(a[i].y-a[k].y)<=d*d)join(i,k);}}}if(ch=='S'){int x1,y1;scanf("%d%d",&x1,&y1);if(find(x1)==find(y1))printf("SUCCESS\n");elseprintf("FAIL\n");}} }總結
以上是生活随笔為你收集整理的(并查集)Wireless Network的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android8 通知呼吸灯_Andro
- 下一篇: 算法竞赛入门经典 第七章 总结