HDU 1232 畅通工程

Description

给N个城市,再给出M条关系,表示两者是否连通

再修几条路,使他们全部连通

Algorithm

并查集
并一下,看最后有几个集合,那个-1就是ans

Code

import java.util.Scanner;

class UnionFind {
  int n;
  int[] par;
  int[] rank;
  UnionFind(int nn) {
    n = nn;
    par = new int[n];
    rank = new int[n];
    for (int i = 0; i < n; i++) {
      par[i] = i;
      rank[i] = i;
    }
  }
  int find(int x) {
    if (par[x] == x) {
      return x;
    }else
      return par[x] = find(par[x]);
  }
  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) return;
    if (rank[x] < rank[y]) {
      par[x] = y;
    } else {
      par[y] = x;
      if (rank[x] == rank[y]) rank[x]++;
    }
  }
  boolean same(int x, int y) {
    return find(x) == find(y);
  }
  void print() {
    for (int i = 0; i < n; i++) {
      System.out.print(" " + par[i]);
    }
  }
  int total() {
    int s = 0;
    for (int i = 0; i < n; i++) {
      if (par[i] == i) s++;
    }
    return s;
  }
}
public class Main {
  public static void main(String[] args) {
    Scanner cin = new Scanner(System.in);
    for (;;) {
      int n = cin.nextInt();
      if (n == 0) break;
      int m = cin.nextInt();
      UnionFind unionFind = new UnionFind(n);
      for (int i = 0; i < m; i++) {
        int u = cin.nextInt() - 1;
        int v = cin.nextInt() - 1;
        unionFind.unite(u, v);
      }
      System.out.println(unionFind.total() - 1);
    }
  }
}

你可能感兴趣的:(HDU 1232 畅通工程)