题解 | #畅通工程#
畅通工程
https://www.nowcoder.com/practice/4878e6c6a24e443aac5211d194cf3913
#include<iostream> const int MAX = 1000; class UnionFind { private: int m_Father[MAX]; int m_Height[MAX]; int m_cnt=0; public: UnionFind(int n) { for(int i=1;i <=n;i++) { m_Father[i] = i; m_Height[i] = 0; } } int Find(int x) { if(x != m_Father[x]) { m_Father[x] = Find(m_Father[x]); } return m_Father[x]; } void Union(int x, int y) { int x_father = Find(x); int y_father = Find(y); if(x_father != y_father) { if(m_Height[x_father] < m_Height[y_father]) m_Father[x_father] = y_father; else if(m_Height[x_father] > m_Height[y_father]) m_Father[y_father] = x_father; else { m_Father[y_father] = x_father; m_Height[x_father]++; } } } int Count(int n) { for(int i=1;i<=n;i++) { if(i == Find(i)) m_cnt++; } return m_cnt-1; } }; int main() { int townNum, roadNum; int roadA, roadB; while (std::cin >> townNum) { if(townNum == 0) break; std::cin >> roadNum; UnionFind* uf = new UnionFind(townNum); for(int i=0;i<roadNum;i++) { std::cin >> roadA >> roadB; uf->Union(roadA, roadB); } std::cout << uf->Count(townNum) << std::endl; delete uf; } }