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");            }         }    }} 
原创粉丝点击