专题四 · 1003

来源:互联网 发布:手机怎样备份所有数据 编辑:程序博客网 时间:2024/05/17 23:06

代码及解释

#include <algorithm>#include <cmath>#include <cstdio>#include <iostream>// 上课讲的一道题// 并查集的思考:// 一种并查集是上课的时候老师讲的// 这种并查集的查询效率很快// 但是更新的速度比较慢// 实际上另外一种是查询效率慢// 更新速度很快// 这两种可以应用于不同的场景using std::cin;using std::cout;using std::endl;const int SIZE = 1500;int set[SIZE];int find_set(int x) {  int r = x;  while (set[r] != r)    r = set[r];  return r;}void merge(int x, int y) {  x = find_set(x);  y = find_set(y);  if (x != y)    set[x] = y;}int main() {  int n, m;  while (cin >> n && n) {    for (int i = 1; i <= n; i++)      set[i] = i;    cin >> m;    while (m--) {      int x, y;      scanf("%d %d", &x, &y);      merge(x, y);    }    int count = -1;    for (int i = 1; i <= n; i++)      if (set[i] == i)        count++;    printf("%d\n", count);  }}
0 0
原创粉丝点击