并查集的应用(05年浙大复试上机题畅通工程)

来源:互联网 发布:打电话变声软件 编辑:程序博客网 时间:2024/05/29 14:34
#include <stdio.h>#define N 1000int Tree[N];int findRoot(int x) {    if(Tree[x] == -1) return x;    else {        int tmp = findRoot(Tree[x]);        Tree[x] = tmp;        return tmp;    }}int main() {    int m, n;    int i;    while(scanf("%d", &n) != EOF && n != 0) {        scanf("%d", &m);        for(i = 1; i <= n; i ++) Tree[i] = -1;        while(m-- != 0) {            int a, b;            scanf("%d%d", &a, &b);            a = findRoot(a);            b = findRoot(b); //查找边的两个顶点所在集合信息            if(a != b) Tree[a] = b;        }        int ans = 0;        for(int i = 1; i <= n; i ++) {            if(Tree[i] == -1) ans ++;        }        printf("%d\n", ans - 1);    }    return 0;}