HDU 1272 并查集

来源:互联网 发布:大数据专业主要课程 编辑:程序博客网 时间:2024/05/18 02:31
//中文题。。题意不需解释。。。并查集题目,判断条件显然为所有输入的点都已经访问到并且总集合数为1,//同时如果对当前输入的两个点,他们的root必须不一样,因为如果一样即可以从这两个点的任意一个点出发访问到另一个点。。。//如上述条件都满足则可以输出Yes,反之输出No。本人此题RE了N次,//表示如果OJ显示STACK FLOW就是main()函数里面的数组开多开大了,少用数组即可。。。。#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<cstdlib>using namespace std;///尽量节约数组,省点空间int Find(int x){    if(x==fa[x]) return x;    else return Find(fa[x]);}void Union(int x,int y){    int tempx=Find(x);    int tempy=Find(y);    if(tempx==tempy) return ;    else        fa[tempx]=tempy;}void init(){    for(int i=1;i<=m;i++)        fa[i]=i;}int main(){    while(scanf("%d",&n)!=EOF)    {        init();        for(int i=1;i<=n;i++)        {           scanf("%d%d",&tempa,&tempb);           if(Find(tempa)==Find(tempb))           {               flag=false; break;           }           else            Union(tempa,tempb);        }        int test=Find(1);        for(int i=1;i<=m;i++)            if(Find(i)!=test)                flag=false,break;        if(flag) cout<<"Yes"<<endl;        else cout<<"No"<<endl;    }}

0 0
原创粉丝点击