zoukankan      html  css  js  c++  java
  • pku 2236 Wireless Network

    题目:http://poj.org/problem?id=2236

    方法一:

    修好的电脑用k[i]=1标记,没有修好的用k[i]=0标记,构造并查集时用k[i]=1的

    代码:

    View Code
    #include<stdio.h>
    #include
    <math.h>
    struct node
    {
    int x,y;
    }s[
    1001];
    int d;
    int set[1001];
    bool k[1001];
    int distance(node a,node b)
    {

    if((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)<=d)
    return 1;
    return 0;
    }

    int find(int x)
    {
    int j,i=x;
    if(x==set[x])
    return x;
    else
    set[x]=find(set[x]);
    while(set[x]!=i)
    {
    j
    =set[i];
    set[i]=set[x];
    i
    =j;
    }
    return set[x];
    }

    void merge(int x,int y)
    {
    int fx=find(x);
    int fy=find(y);
    set[fx]=fy;
    }

    int main()
    {
    int n,num,i,x,y,p;
    char ch;
    scanf(
    "%d%d",&n,&d);
    d
    =d*d;
    for(i=1;i<=n;i++)
    {
    scanf(
    "%d%d",&s[i].x,&s[i].y);
    k[i]
    =0;
    set[i]=i;
    }
    num
    =0;
    getchar();
    while(scanf("%c",&ch)!=EOF)
    {
    if(ch=='O')
    {
    num
    ++;
    scanf(
    "%d",&p);
    k[p]
    =1;
    if(num!=1)
    {
    for(i=1;i<=n;i++)
    {
    if(k[i]&&distance(s[i],s[p]))
    merge(i,p);
    }
    }
    }

    if(ch=='S')
    {
    scanf(
    "%d%d",&x,&y);
    if(find(x)==find(y)||distance(s[x],s[y]))
    printf(
    "SUCCESS\n");
    else
    printf(
    "FAIL\n");
    }
    getchar();
    }
    return 0;
    }

    方法二:

    把修好的电脑放到数组p[]中,但时间上尽然比方法一还慢,并且在放入p时,i不能从0开始否则会re求高人指点

    代码:

    View Code
    #include<stdio.h>
    #include
    <math.h>
    struct node
    {
    int x,y;
    int k;
    }s[
    1001],p[1001];
    int set[1001];
    int d;
    int distance(node a,node b)
    {

    if((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+0.0<=d)
    return 1;
    return 0;
    }

    int find(int x)
    {
    int j,i=x;
    if(x==set[x])
    return x;
    else
    set[x]=find(set[x]);
    while(set[x]!=i)
    {
    j
    =set[i];
    set[i]=set[x];
    i
    =j;
    }
    return set[x];
    }

    void merge(int x,int y)
    {
    int fx=find(x);
    int fy=find(y);
    set[fx]=fy;
    }

    int main()
    {
    int n,i,j,w,x,y;
    char ch;
    scanf(
    "%d%d",&n,&d);
    d
    =d*d;
    for(i=1;i<=n;i++)
    {
    scanf(
    "%d%d",&s[i].x,&s[i].y);
    s[i].k
    =i;
    set[i]=i;
    }
    i
    =1;
    getchar();
    while(scanf("%c",&ch)!=EOF)
    {
    if(ch=='O')
    {
    scanf(
    "%d",&w);
    p[i]
    =s[w];
    i
    ++;
    if(i>1)
    {
    for(j=1;j<i-1;j++)
    {
    if(distance(p[j],p[i-1]))
    merge(p[j].k,p[i
    -1].k);
    }
    }
    }

    if(ch=='S')
    {
    scanf(
    "%d%d",&x,&y);
    if(find(x)==find(y)||distance(s[x],s[y]))
    printf(
    "SUCCESS\n");
    else
    printf(
    "FAIL\n");
    }
    }
    return 0;
    }

      

  • 相关阅读:
    sqlserver把小数点后面多余的0去掉
    C#使用Linq对DataGridView进行模糊查找
    winform dataGridView DataGridViewComboBoxColumn 下拉框事件
    JGit与远程仓库链接使用的两种验证方式(ssh和https)
    Quartz不用配置文件配置启动
    SpringBoot之退出服务(exit)时调用自定义的销毁方法
    Java注解Annotation
    Java自定义数据验证注解Annotation
    我的ehcache笔记
    Java中泛型Class<T>、T与Class<?>
  • 原文地址:https://www.cnblogs.com/lujiacheng/p/2115804.html
Copyright © 2011-2022 走看看