題意:Kruskal算法最小生成樹
AC代碼:
#include <iostream> using namespace std; const int maxn1 = 1005; int par[maxn1]; int rank1[maxn1]; void init() { for (int i = 0; i <= maxn1; i++) { par[i] = i; rank1[i] = 0; } } 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 (rank1[x] < rank1[y]) par[x] = y; else { par[y] = x; if (rank1[x] == rank1[y]) rank1[x]++; } } bool same(int x, int y) { return Find(x) == Find(y); } int main() { int m, n; while (cin >> n) { if (n == 0) break; cin >> m; init(); while (m--) { int a[2]; scanf("%d %d", &a[0], &a[1]); unite(a[0], a[1]); } int ans = 0; for (int i = 1; i < n; ++i) { for (int j = i + 1; j <= n; ++j) { if (!same(i, j)) { ans++; unite(i,j); } } } cout<<ans<<endl; } return 0; }