【A - Wireless Network】

Summer friends, do disjoint-set topics ~ ~ ~ ~

Ideas:

  • The first pre-qualified Mark the distance between the computer.
  • Consolidation may occur at each repair.
  • Each time ask to see if the same group.

note:

  • Without the header file might inexplicable error .
  • scanf note add getchar .
  • Write recursive FIND , you do not need to write recursive.

Code:

  • 3000ms 1680kB
//3000ms	1680kB


#include <iostream>
#include <cstdio>//Permission denied
#include <cstring>

using namespace std;

const int maxn = 1005;

int N,D;
struct NODE{
	int x;
	int y;
	bool ok;
};
NODE node[maxn];
bool mp[maxn][maxn];
int par[maxn];

int CAL(int i,int j){
	int X = (node[i].x - node[j].x)*(node[i].x - node[j].x);
	int Y = (node[i].y - node[j].y)*(node[i].y - node[j].y);
	return X + Y;
}

void INIT(){
	memset(par , -1 , sizeof(par));
	return ;
}

int FIND(int i){
	return par[i] == -1 ? i : par[i] = FIND(par[i]);
}//递归版,并且将路径上所有点的 par都置成 root 

void UNION(int l,int r){
	int parl = FIND(l) ; 
	int parr = FIND(r) ;
	if(parl != parr)
		par[parl] = parr;
	return ;
}

int main(){
	memset(mp , 0 , sizeof(mp));
	scanf("%d%d" , &N , &D);
	INIT();
	for(int i=1;i<=N;i++){
		scanf("%d%d" , &node[i].x , &node[i].y);
		node[i].ok = false;
	}
	//预处理,将距离合格的两台机器之间联通 mp 
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++){
			if(i == j)
				mp[i][j] = true;
			else{
				if(CAL(i , j) <= D*D)
					mp[i][j] = mp[j][i] = true; 
			}
		}
	}
	getchar(); 
	char c;//在使用 scanf同时读取字符和数字时,要注意使用getchar() 
	while(~scanf("%c" , &c)){
		getchar(); 
		int l,r;
		if(c == 'O'){
			scanf("%d" , &l);
			node[l].ok = true;
			for(int i=1;i<=N;i++){
				if(l!=i && mp[l][i] && node[i].ok)
					UNION(l , i);
			}
		}
		else{
			scanf("%d%d" , &l , &r);
			if(FIND(l) == FIND(r))
				printf("SUCCESS\n");
			else
				printf("FAIL\n");
		}
		getchar();
	}
	return 0;
}
  • Recursive FIND function: 3032ms 1680kB
int FIND(int i){
	int root = i;
	while(par[root] != -1)
		root = par[root];
	while(i != root){
		par[i] = root;
		i = par[i];
	}
	return root;
}

Guess you like

Origin blog.csdn.net/flash403/article/details/94215563