zoukankan      html  css  js  c++  java
  • poj2236(并查集)

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

    思路:

    看到时间给到了10000MS,就可以直接套并查集板子了,不用特殊技巧。用结构体表示computer,元素x,y,s分别表示横纵坐标和状态(0表示未修好,1表示修好),root数组表示祖先数组,记住要初始化。还有输入字符时要么scanf(" %c",&c)(%c前加一个空格),要么用cin,因为scanf读字符不会吃掉换行,所以会读错,加个空格就行了(具体原因我也不知道,但这样用一直没错过)。详见代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 
     5 struct node{
     6     int x,y,s;
     7 }a[1005];
     8 
     9 int n,d,root[1005],p,q;
    10 char c;
    11 
    12 int getr(int k){
    13     if(root[k]==k) return k;
    14     else return root[k]=getr(root[k]);
    15 }
    16 
    17 bool check(int m,int n){
    18     if((a[m].x-a[n].x)*(a[m].x-a[n].x)+(a[m].y-a[n].y)*(a[m].y-a[n].y)<=d*d)
    19         return true;
    20     else
    21         return false;
    22 }
    23 
    24 int main(){
    25     scanf("%d%d",&n,&d);
    26     for(int i=1;i<=n;++i)
    27         scanf("%d%d",&a[i].x,&a[i].y),root[i]=i;
    28     while(~scanf(" %c",&c)){
    29         if(c=='O'){
    30             scanf("%d",&p);
    31             a[p].s=1;
    32             for(int i=1;i<=n;++i)
    33                 if(a[i].s==1&&check(p,i))
    34                     root[getr(i)]=getr(p);
    35         }
    36         else{
    37             scanf("%d%d",&p,&q);
    38             if(getr(p)==getr(q))
    39                 printf("SUCCESS
    ");
    40             else 
    41                 printf("FAIL
    ");
    42         }
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    05-3. 六度空间 (PAT)
    05-2. Saving James Bond
    05-1. List Components (PAT)
    04-3. Huffman Codes (PAT)
    04-2. File Transfer (PAT)
    04-1. Root of AVL Tree (PAT)
    03-3. Tree Traversals Again (PAT)
    03-2. List Leaves (PAT)
    03-1. 二分法求多项式单根(PAT)
    CDH Namenode自动切换(active-standby)
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/10451599.html
Copyright © 2011-2022 走看看