標籤:os io for ar amp size ios har
思路詳見課本 P 213
思路:直接用並查集,最後看 p 和 q 是否 在一個 集合中 即可。屬於同一集合,則 可以通訊;否則失敗。
#include<iostream>#include<cstring>using namespace std;const int maxn=1000 +100;int set[maxn];int xx[maxn];int yy[maxn];bool valid[maxn];int n,d;int set_find(int d)//路徑壓縮的 合并樹根 的函數{if(set[d]<0)return d;return set[d]=set_find(set[d]);}void join(int x,int y){x=set_find(x);y=set_find(y);if(x!=y)//-----------此處這個判斷千萬不能少,否則在 set_find()函數中,出現死迴圈(由於節點 自己 指向 自己,找不到 結束條件 (即樹根))//------------提交會出現runtime error set[x]=y;}int in(int i,int p)//判斷i 是否在 p的範圍內{if( (xx[i]-xx[p]) * (xx[i]-xx[p]) + (yy[i]-yy[p]) * (yy[i]-yy[p]) <= d*d )return 1;return 0;}void repair(int p)//修複 p{valid[p]=1;int i;for(i=1;i<=n;i++) if( valid[i] &&in(i,p) &&i!=p)join(i,p);}void search(int p,int q) //查看 p 和 q是否 可以 通訊{if( set_find(p)==set_find(q) )cout<<"SUCCESS"<<endl;elsecout<<"FAIL"<<endl;}int main(){memset(set,-1,sizeof(set));memset(xx,0,sizeof(xx));memset(yy,0,sizeof(yy));memset(valid,0,sizeof(valid));cin>>n>>d;int i;for(i=1;i<=n;i++)cin>>xx[i]>>yy[i];char c;while(cin>>c){if(c==‘O‘){int p;cin>>p;repair(p);}else if(c==‘S‘){int p,q;cin>>p>>q;search(p,q);}}return 0;}