#include<vector> #include<iostream> #include<algorithm> #include<unordered_set> #include<unordered_map> using namespace std; class Solution { public: int N, M, K; int total; vector<int> pre; void solve() { cin >> N >> M >> K; total = N; pre = vector<int>(N+M, -1); for (int i = 0; i < N; ++i) { pre[i] = i; } int rootu, rootv, u, v; for (int k = 0; k < K; ++k) { cin >> u >> v; --u, --v, v += N; if (pre[v] == -1) { pre[v] = unionsearch(u); }else{ rootu = unionsearch(u); rootv = unionsearch(v); if(rootu!=rootv){ pre[rootu] = rootv; --total; } } } cout << total - 1 << endl; } int unionsearch(int k) { int root = pre[k]; while (root != pre[root]) { root = pre[root]; } int cur_node = k, pre_node = pre[k]; while (cur_node != root) { pre[cur_node] = root; cur_node = pre_node; pre_node = pre[cur_node]; } return root; } }; int main() { Solution s; s.solve(); return 0; } 过了91%
点赞 3

相关推荐

求求要我吧:你教育经历放在下面干什么,而且27届还是28届啊()另外看你简历有两面,通常来说投递运营岗位一面简历就够了。另外个人总结要写也放在简历最下面,然后你奖项那里是2019年的哇哈哈,那你究竟投递的是社招还是实习?实习的话你是第几届是肯定要写出来的,社招的话你这个工作经历又太短太花了
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务