kuangbin专题五 并查集 POJ2236-Wireless Network
来源:互联网 发布:linux 访问smb 编辑:程序博客网 时间:2024/06/05 15:13
题意:
有一个计算机的网络的所有线路都坏了,网络中有n台计算机,现在你可以做两种操作,修理(O)和检测两台计算机是否连通(S),只有修理好的计算机才能连通。连通有个规则,两台计算机的距离不能超过给定的最大距离D。检测的时候输出两台计算机是否能连通。
还不理解题意?说个例子,假如A和B两个计算机已经修理完毕,但是两者的最大距离大于D,则不能连通,但是C和A和B的最大距离不超过D,而C刚刚被修理好,A则可以通过C来与B连通。
题解:
每次修理好一台计算机就遍历与该计算机相近不超过D的计算机,如果也是修理好的话,就连通,这里不能直接用for,需要用到vector容器,不然可能会超时。每次检查的时候判断一下这两台计算机是否在同一集合中即可(即find(u)是否等于find(u)。
#include<stdio.h>#include<string.h>#include<math.h>#include<vector>#include<set>#include<algorithm>using namespace std;const int MAXN=1e3+7;struct node{ double x,y;}a[MAXN];vector<int>map[MAXN];bool vis[MAXN];int f[MAXN];int size[MAXN];double getjvli(double x1,double y1,double x2,double y2){ double l=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); return l;}void init(){ memset(vis,false,sizeof(vis)); for(int i=1;i<=1001;i++) f[i]=i,size[i]=1;}int find(int p){ while(p!=f[p]) { f[p]=f[f[p]]; p=f[p]; } return p;}void Union(int p,int q){ int pcom=find(p); int qcom=find(q); if(qcom==pcom) return ; if(size[pcom]>size[qcom]) { f[qcom]=pcom; size[pcom]+=size[qcom]; } else { f[pcom]=qcom; size[qcom]+=size[pcom]; }}int main(){ int n,m; double d; while(~scanf("%d%lf",&n,&d)) { init(); for(int i=1;i<=n;i++) map[i].clear(); for(int i=1;i<=n;i++) { scanf("%lf%lf",&a[i].x,&a[i].y); } for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) if(getjvli(a[i].x,a[i].y,a[j].x,a[j].y)<=d) map[i].push_back(j),map[j].push_back(i); }// for(int i=1;i<=n;i++){// printf("%d: ",i);// for(int j=0;j<map[i].size();j++)// {// printf("%d ",map[i][j]);// }// printf("\n");// } char s[5]; while(~scanf("%s",&s)) { int u,v; if(s[0]=='O') { scanf("%d",&u); vis[u]=true; for(int i=0;i<map[u].size();i++) if(vis[map[u][i]]) { // printf("%d: vis %d\n",u,map[u][i]); Union(map[u][i],u); } } else if(s[0]=='S') { scanf("%d%d",&u,&v); // printf("%d %d\n",f[u],f[v]); if(find(u)==find(v)) printf("SUCCESS\n"); else printf("FAIL\n"); } } }}
阅读全文
0 0
- kuangbin专题五 并查集 POJ2236-Wireless Network
- POJ 2236 A - Wireless Network[kuangbin带你飞]专题五 并查集
- POJ2236 Wireless Network(并查集)
- POJ2236 Wireless Network(并查集)
- POJ2236 Wireless Network [并查集]
- poj2236 Wireless Network 并查集
- poj2236 Wireless Network(并查集)
- POJ2236 Wireless Network 【并查集】
- POJ2236 Wireless Network 并查集
- poj2236 Wireless Network(并查集)
- POJ2236 Wireless Network 并查集
- [并查集]poj2236 Wireless Network
- POJ2236,Wireless Network,并查集
- [并查集] poj2236 Wireless Network
- POJ2236-Wireless Network-并查集
- POJ2236 Wireless Network(并查集)
- poj2236 Wireless Network 简单并查集
- POJ2236 Wireless Network(并查集)
- from表单+地区
- eclipse打点没提示原因
- 菜鸟备忘录[CSS3]——媒体查询使用方法@media
- CodeForces 830C Bamboo Partition
- SpringAOP整合Hibernate并使用事务(模拟买书的过程)
- kuangbin专题五 并查集 POJ2236-Wireless Network
- UE4 C++创建删除文件夹(对本地文件夹进行操作)
- shell
- Docker: 精通ENTRYPOINT指令
- 栈的基本操作
- 给你一台大疆无人机,你能用来做点啥?(三)------倾斜摄影建模基础
- Eclipse 创建一个项目 并使用 git 上传到 码云
- jQuery添加删除,全选反选,批量删除
- Tourism Planning (状态dp)