POJ 2236 Wireless Network 第一次做并查集,第…
2018-06-17 23:56:15来源:未知 阅读 ()
题意是判断两台电脑是否能通讯,两台修好的电脑距离在指定距离内可直接通讯,且两台修好的电脑能通过一台修好的电脑间接通讯。代码如下:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int father[1005]; struct Coord //电脑坐标 { int x; int y; } coo[1005]; struct Repair //已修复好的电脑的坐标和编号 { int x; int y; int numb; } rep[1005]; int Find_fath(int x) //并查集寻找父亲 { if (x != father[x]) father[x] = Find_fath(father[x]); //压缩返回路径 return father[x]; } void Union(int x,int y) //并查集父亲合并 { x=Find_fath(x); y=Find_fath(y); if(x!=y) father[y]=x; } int main() { //freopen("in.txt","r",stdin); int n,d; int num_rep=0; //修复电脑的数量 char oper; //对电脑的操作 cin>>n>>d; for(int i=1; i<=n; i++) scanf("%d%d",&coo[i].x,&coo[i].y); for(int i=1; i<=n; i++) father[i]=i; //初始化父亲为自己 getchar(); while(scanf("%c",&oper)!=EOF) { if(oper=='O') { int numb; scanf("%d",&numb); rep[num_rep].x=coo[numb].x; rep[num_rep].y=coo[numb].y; rep[num_rep].numb=numb; for(int i=0; i<num_rep; i++) { if(num_rep==0)break; int a,b; a=rep[i].x-rep[num_rep].x; b=rep[i].y-rep[num_rep].y; if(a*a+b*b<=d*d) Union(rep[i].numb,rep[num_rep].numb); } num_rep++; } else { int num1,num2; scanf("%d%d",&num1,&num2); if(Find_fath(num1)==Find_fath(num2)) printf("SUCCESS\n"); else printf("FAIL\n"); } getchar(); } return 0; }
不足之处,望多指点改正。转载请标明出处。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- POJ-3278 2020-04-01
- Asteroids!_poj2225 2020-02-09
- poj-1753题题解思路 2020-01-26
- POJ1852 2019-11-11
- POJ2431 优先队列+贪心 - biaobiao88 2019-11-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash