HDU 1272 小西的迷宮 圖判環
阿新 • • 發佈:2020-09-19
並查集判環
思路: 並查集判環,挺簡單的,如果剛開始就指向了一個根,後面又指向了他,說明就成環了(這裡不考慮資料重複,比如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; } } } } }