标签:
Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
并查集 #include<stdio.h> # define N 30010 int A[N]; void Start() { int i; for (i = 0; i < N; i++) A[i] = i; } //初始化,刚开始每个元素的根节点就是自身 int Find(int x) { if (A[x] != x) A[x] = Find(A[x]); return A[x]; } //递归查找每个元素现在的根节点 int main () { int n, m, a, b, x, y, k, K, i, sum, p; while (scanf("%d %d", &n, &m), n+m) { sum = 0; Start(); while (m--) { scanf("%d %d", &k, &a); for (i = 1; i < k; i++) { scanf("%d", &b); x = Find(a); //a的值没有变化,但它的根节点需要随着b的输入而改变 y = Find(b); if (x != y) A[x] = y; } //最终一个集合中的元素,其根节点都是一样的 } p = Find(0); //0是感染源,所以需要找到其根节点 for (i = 0; i < n; i++) { K = Find(i); if (p == K) sum++; } //判断各元素的根节点是否与感染源的根节点相同 printf("%d\n", sum); } return 0; }
标签:
原文地址:http://www.cnblogs.com/syhandll/p/4451390.html