1. 程式人生 > 實用技巧 >解決win10下 Virtual Box USB功能無法使用問題

解決win10下 Virtual Box USB功能無法使用問題

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;}