1. 程式人生 > 實用技巧 >HDU 1272 小西的迷宮 圖判環

HDU 1272 小西的迷宮 圖判環

題目連結

並查集判環

思路: 並查集判環,挺簡單的,如果剛開始就指向了一個根,後面又指向了他,說明就成環了(這裡不考慮資料重複,比如2->3,2->3)。這個題還有一個點要注意,單次資料可能不止一張圖!

package 記錄.HDU;

import java.util.HashSet;
import java.util.Scanner;

public class H1272 {

    public static int []F;
    public static int []vis;

    public static int findFather(int x) {
        int a = x;
        while (x != F[x]) x = F[x];

        while (a != F[a]) {
            int z = a;
            a = F[a];
            F[z] = x;
        }
        return x;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a, b;
        int sum = 0;
        F = new int[100010];
        vis = new int[100010];
        for (int i = 1; i < 100010; i++) {
            F[i] = i;
        }

        boolean flag = false;
        while (true) {
            a = sc.nextInt();
            b = sc.nextInt();
            if (a == b && a == 0) {

                sum = 0;
                for (int i = 1; i < 100010; i++) {
                    if (vis[i] == 1 && F[i] == i) {
                        sum++;
                        if (sum > 1) {
                            flag = true;
                            break;
                        }
                    }
                }
                System.out.println(flag == true ? "No" : "Yes");

                // 初始化
                F = new int[100010];
                vis = new int[100010];
                for (int i = 1; i < 100010; i++) {
                    F[i] = i;
                }
                flag = false;
                continue;
            }

            if (a == b && a == -1) {
                break;
            }

            int fa = findFather(a);
            int fb = findFather(b);
            vis[a] = 1;
            vis[b] = 1;

            if (flag == false) {
                // 如果a和b的節點的根不一致,那麼讓他們相連
                if (fa != fb) {
                    F[fa] = fb;
                    // 如果他們的節點一致的話,說明之前已經連線過,那麼此時成環?
                } else {
                    flag = true;
                }
            }
        }

    }
}