图-并查集

package Week1;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/*
4 1
0 1
0 2
0 3
0 4
O 1
O 2
O 4
S 1 4
O 3
S 1 4  并查集 O开始的修复该电脑,S问答a和b是否联通

list存修复的点,读到O开头的每次修复的点与list已修复点的集合比较,看安全距离小于等于D则表示连通,否则不连通

*/


public class C_Wireless {
    static int N,D;
    static int p[];
    static Node nodes[];
    static List<Integer> list = new ArrayList<Integer>();
    public static void main(String[] args) throws Exception{
        System.setIn(new FileInputStream("Solution.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        D = Integer.parseInt(st.nextToken());
        nodes = new Node[N+1];
        p = new int[N+1];
        for (int i = 1; i <= N; i++) {
            p[i]=i;
        }
        for (int i = 1; i <= N; i++) {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            nodes[i]=new Node(x, y);
        }
        
        while(br.ready()) {
            st = new StringTokenizer(br.readLine());
            String q = st.nextToken();
            if("O".equals(q)) {
                int point = Integer.parseInt(st.nextToken());
                list.add(point);
                for (int i = 0; i < list.size(); i++) {
                    int idx = list.get(i);
                    Node a = nodes[point];
                    Node b = nodes[idx];
                    if(isConnect(a,b,D)) {
                        union(point,idx);
                    }
                }
            }
            if("S".equals(q)) {
                int x = Integer.parseInt(st.nextToken());
                int y = Integer.parseInt(st.nextToken());
                if(find(x)==find(y)) {
                    System.out.println("SUCCESS");
                }else {
                    System.out.println("FAIL");
                }
            }
            
        }
        
    }
    
    public static void union(int x,int y) {
        int a = find(x);
        int b = find(y);
        if(a == b) {
            return ;
        }
        if(a < b) {
            p[b]=a;
        }
        if(a > b) {
            p[a]=b;
        }
    }

    private static int find(int i) {
        if(i==p[i]) {
            return i;
        }
        return p[i]=find(p[i]);
    }
    
    public static  boolean isConnect(Node a,Node b,int D) {
        double temp = Math.pow((a.x-b.x),2)+Math.pow((a.y-b.y), 2);
        if(temp <= D*D) {
            return true;
        }
        return false;
    }
    
    
}

class Node {
    int x,y;
    public  Node(int x,int y) {
        this.x=x;
        this.y=y;
    }
    
    
}

 

posted @ 2021-08-01 18:39  没带壳的蜗牛  阅读(62)  评论(0)    收藏  举报