poj 2542 题解

来源:互联网 发布:语音视频聊天软件 编辑:程序博客网 时间:2024/05/17 22:15
题意
  一个校园内的所有学生都有宗教信仰,现在要做一个调查,你不能直接问每一个学生,但是可以通过询问他的朋友是否和他的宗教信仰一样,最后需要统计出这个校园内有多少不同的宗教信仰。
  输入有多组测试数据,每组开头是两个数,n和m,分别表示学校有n名学生和m组询问。后面是m行询问。最后当n和m都为0的时候停止。
  思路
  很明显的并查集问题。将一样的宗教信仰的集合合并,最后写一个for循环统计还有多少不同的信仰即可。
  注意
  每一个人都有宗教信仰,也就是说某一个编号没有在m组询问中出现,不要忽略它,他也是一个信仰
#include <iostream>#include <stdio.h>using namespace std;#define MAXN 50010int par[MAXN];    //par[x]表示x的父节点int n;void Init()    //初始化{    int i;    for(i=1;i<=n;i++)        par[i] = i;}int Find(int x)    //查询x的根节点并路径压缩{    if(par[x]!=x)        par[x] = Find(par[x]);    return par[x];}void Union(int x,int y)    //合并x和y所在集合{    par[Find(x)] = Find(y);}int main(){    int m,x,y,i,Case=1;    while(scanf("%d%d",&n,&m)!=EOF){        if(n==0 && m==0)            break;        //初始化        Init();            //m次询问        while(m--){            scanf("%d%d",&x,&y);            Union(x,y);        }        int ans = n;        for(i=1;i<=n;i++)    //统计            if(par[i]!=i)                --ans;        printf("Case %d: %d\n",Case++,ans);    }    return 0;}

虽然自己很菜 但是还是要爬着前行