解決win10下 Virtual Box USB功能無法使用問題
阿新 • • 發佈:2020-10-10
Wireless Network
題意
N臺損壞的計算機,任意兩臺計算機之間距離小於D即可連線,計算機最初不連線,經過若干次操作,操作一,O X ,修復X計算機,並連線所有與X距離不大於D的計算機,操作二,S P Q ,詢問P,Q是否存在一條連線的線路,不存在輸出FAIL,存在輸出SUCCESS
題解
並查集求解
vis :記錄是否修復
ms :記錄任意兩點距離
per :記錄祖先節點
#pragma GCC optimize(2) #include <iostream> #include <map> #include <vector> #include <queue> #include <string> #include <set> #include <algorithm> #include <cstring> #include <string> #include <vector> #include <map> #include <set> #include <list> #include <deque> #include <queue> #include <stack> #include <cstdlib> #include <cstdio> #include <cmath> #include <iomanip> using namespace std; const int inf=0x3f3f3f3f; #define eps 1e-5 #define pii pair<int,int> #define FI first #define SE second #define ll long long #define ull unsigned long long const ll mod = 4294967296;/// 998244353; const int mxn = 1e3 +7; int _ , n , m , t , k , cnt , si , res ,ans ; template <class T> void rd(T &x){ T flag = 1 ; x = 0 ; char ch = getchar() ; while(!isdigit(ch)) { if(ch=='-') flag = -1; ch = getchar(); } while(isdigit(ch)) { x = (x<<1) + (x<<3) + (ch^48); ch = getchar(); } x*=flag; } int to[mxn] , nx[mxn] , head[mxn] ,per[mxn],x[mxn],y[mxn] ,ms[mxn][mxn]; char op; bool vis[mxn] ; int Find(int x) { return x==per[x]?x:per[x] = Find(per[x]); } void Union(int u,int v) { per[ Find(u) ] = Find(v); } int Dis(int i,int j){return (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]) ;} void solve() { cin>>n>>k; memset(vis,0,sizeof vis); for(int i=1;i<=n;i++) cin>>x[i]>>y[i] , per[i] = i ; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) ms[i][j] = ms[j][i] = (Dis(i,j)<=k*k?1:0); while(cin>>op){ if(op=='O') { cin>>si; vis[si] = 1 ; for(int i=1;i<=n;i++) { if(ms[si][i] && i!=si && vis[i]){ int ui = Find(si) , vi = Find(i); if(ui!=vi) per[ui] = vi ; } } } else { int u,v,ui,vi; cin>>u>>v; ui = Find(u) , vi = Find(v) ; if(ui==vi) cout<<"SUCCESS\n"; else cout<<"FAIL\n"; } } } int main(){ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve();return 0;}
The Suspects
題意
求M個集合中,和 0號 在同一集合中所有不同編號的人的個數
題解
並查集
#pragma GCC optimize(2) #include <iostream> #include <map> #include <vector> #include <queue> #include <string> #include <set> #include <algorithm> #include <cstring> #include <string> #include <vector> #include <map> #include <set> #include <list> #include <deque> #include <queue> #include <stack> #include <cstdlib> #include <cstdio> #include <cmath> #include <iomanip> using namespace std; const int inf=0x3f3f3f3f; #define eps 1e-5 #define pii pair<int,int> #define FI first #define SE second #define ll long long #define ull unsigned long long const ll mod = 4294967296;/// 998244353; const int mxn = 3e4 +7; int _ , n , m , t , k , cnt , si , res ,ans ; template <class T> void rd(T &x){ T flag = 1 ; x = 0 ; char ch = getchar() ; while(!isdigit(ch)) { if(ch=='-') flag = -1; ch = getchar(); } while(isdigit(ch)) { x = (x<<1) + (x<<3) + (ch^48); ch = getchar(); } x*=flag; } int to[mxn] , nx[mxn] , head[mxn] ,per[mxn],x[mxn],y[mxn]; char op; bool vis[mxn] ; int Find(int x) { return x==per[x]?x:per[x] = Find(per[x]); } void Union(int u,int v) { per[ Find(u) ] = Find(v); } int Dis(int i,int j){return (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]) ;} void solve() { while(cin>>n>>m&&(m||n)){ for(int i=0;i<=n;i++) per[i] = i ; int u , v , ui , vi ; ans = 1 ; for(int i=1;i<=m;i++){ for(cin>>k , _=1;k;k--){ cin>>v; if(_==1) { u = v ; _=0 ; ui = Find(u);} else { vi = Find(v) ; if(ui!=vi) per[vi] = ui ; } } } ui = Find(0) ; for(int i=1;i<=n;i++) ans+= (Find(i)==ui); cout<<ans<<endl; } } int main(){ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve();return 0;}