分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

poj 2236 Wireless Network ?(并查集)

发布时间:2023-09-06 02:12责任编辑:熊小新关键词:暂无标签

链接:http://poj.org/problem?id=2236

题意:

有一个计算机网络,n台计算机全部坏了,给你两种操作:

1.O x 修复第x台计算机

2.S x,y 判断两台计算机是否联通

联通的条件: 两台都修复好了,求距离小于d

思路:

数据很小,我们可以没修复一台就直接枚举已经修复的计算机找到距离小于d的,放到一个并查集里,查询的话直接查询是否再同一个并查集里就好了

实现代码:

//while(scanf("\n%c", &ope) != EOF)#include<iostream>#include<cstdio>using namespace std;const int M = 1e4+10;struct node{ ???int x,y,id;}a[M],b[M];int n,d;int f[M];int find(int x){ ???if(x == f[x]) return x; ???return f[x] = find(f[x]);}void mix(int x,int y){ ???int fx = find(x); ???int fy = find(y); ???if(fx != fy) f[fx] = fy;}bool check(node a,node b){ ???double num = (a.x - b.x)*(a.x - b.x)+(a.y - b.y)*(a.y - b.y); ???double num1 = d*d*1.0; ???if(num <= num1) return 1; ???return 0;}int main(){ ???char op;int k,l,r,cnt = 0; ???scanf("%d%d",&n,&d); ???for(int i = 1;i <= n;i ++) ???????scanf("%d%d",&a[i].x,&a[i].y),a[i].id = i; ???for(int i = 0;i <= n;i ++) ???????b[i].x = 0,b[i].y=0,b[i].id = 0,f[i]= i; ???while(scanf("\n%c", &op) != EOF){ ???????if(op == ‘O‘){ ???????????scanf("%d",&k); ???????????for(int i = 1;i <= cnt;i ++) ???????????????if(check(b[i],a[k])) ???????????????????mix(b[i].id,k); ???????????b[++cnt].x = a[k].x;b[cnt].y = a[k].y,b[cnt].id = a[k].id; ???????} ???????else{ ???????????scanf("%d%d",&l,&r); ???????????if(find(l) == find(r)) printf("SUCCESS\n"); ???????????else printf("FAIL\n"); ???????} ???}}

poj 2236 Wireless Network ?(并查集)

原文地址:https://www.cnblogs.com/kls123/p/9563205.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved