poj 1308 is it a tree?(图的性质||基础并查集) (同hdu 1272 小希的迷宫 )

来源:互联网 发布:博雅软件股份有限公司 编辑:程序博客网 时间:2024/05/21 06:36

题目链接:http://poj.org/problem?id=1308#top (写这题的时候杭电进不去)
题意: 问你输入的一个图是不是一个树,输入n和m表示n和m是连同的,输入0 0表示这个图已经输完可以进行判断,输入-1 -1表示这个程序运行结束。不过写这题的要注意:空树也是树,死人也是人
思路:这题有两个解法,先写并查集的解法,一般人拿到题目分析的时候都是从并查集入手,但是第二个方法就相对来说就比较简单了。
一、基础并查集
并查集三步:根节点,find,unite
然后考虑题目要求:
1、判断是否成环,这个时候就可以利用临近成环的那一刻出现的情况,要成环的接口处两个节点的根节点相同
2、空树,只要知道了这点应该不难判断
3、未连同,如果出现两个及以上的当标记位置不为零时,节点和父节点一样就处于未连同状态

代码:

#include<cstdio>#include<cstring>using namespace std;const int max=50050;int flag[max],pa[max],t;inline void  init(){    for(int i=1;i<max;i++)     pa[i]=i;}int find(int x){    if(x!=pa[x]) pa[x]=find(pa[x]);    return pa[x];}void unite(int x,int y){    int fx=find(x);    int fy=find(y);    if(fx==fy){    t=1;return ;        }    flag[x]=flag[y]=1;     pa[y]=fx;}int main(){    int n,m,l=1,ma,mi;    t=0;    memset(flag,0,sizeof(flag));    init();ma=mi=0;      while(~scanf("%d%d",&n,&m)){      if(n>ma) ma=n;if(m>ma) ma=m;      if(n<mi) mi=n;if(m<mi) mi=m;      if(n==-1&&m==-1) break;      if(n==0&&m==0){        int p=0;        for(int i=mi;i<=ma;i++)         if(flag[i]!=0&&i==pa[i]) p++;        if(p>1) t=1;         memset(flag,0,sizeof(flag));        if(t==0) printf("Case %d is a tree.\n",l);        else printf("Case %d is not a tree.\n",l);        init();l++;t=ma=mi=0;        continue;       }      if(flag[n]==0&&flag[m]!=0) unite(m,n);      else unite(n,m);    }     return 0;}

二、图的性质
这个也算是这题当中树的性质吧。我们可以把这个树看成图(怎么写的那么便扭呢。。。),这个图由节点(dian)和边(bian)组成,当这个图输完的时候
dian>bian+1,说明这个图还有的位置是未连同的;
dian<bian+1 , 说明这个图里成环;
所以判断成树的条件就bian+1=dian;
又因为空树的存在,加上判断条件bian=0;

代码:

#include<cstdio>#include<cstring>const int max=50500;int main(){    int flag[max],dian,bian,max,min;    dian=bian=min=max=0;    int n,m,l=1;    memset(flag,0,sizeof(flag));    while(~scanf("%d%d",&n,&m)){        if(n==-1&&n==-1) break;        if(n==0&&m==0)        {            int sum=0;            memset(flag,0,sizeof(flag));            if(dian==bian+1||bian==0) printf("Case %d is a tree.\n",l);            else printf("Case %d is not a tree.\n",l);            l++;bian=dian=0;            continue;         }        if(n>max) max=n;if(n<min) min=n;        if(m>max) max=m;if(m<min) min=m;        if(flag[n]==0) flag[n]=1,dian++;        if(flag[m]==0) flag[m]=1,dian++;        bian++;             }    return 0;}
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 杂志投稿投到了假的网站怎么办 支付宝骗了5万多怎么办 微信转账到银行卡被骗了怎么办 给对方转账到银行卡疑似被骗怎么办 谷歌邮箱收不到邮件了怎么办 我在微信上做兼职被骗了钱怎么办 要是微信里面做兼职被骗了怎么办 在打离婚管斯死亡赔常金怎么办 编辑部回复我文章没有被录用怎么办 父亲死后教师资格被别人顶替怎么办 刚发的论文影响因子变化了怎么办 奥鹏毕业论文过了提交时间了怎么办 手机电池被拿出来后时间不准怎么办 高中的孩子与同学相处不好怎么办 孩子在幼儿园不敢和老师说话怎么办 注册过万方医学网忘了用户名怎么办 狗咬了没破皮没出血有点疼怎么办 狗咬了没出血肿起来了怎么办 广州已经过了幼儿园报名时间怎么办 大专学费没交学校开始查了怎么办 如果申请留学的本科成绩不够怎么办 硕士读了三年无法毕业怎么办啊 孩子在美国读研读不下去怎么办? 在地割草中过失死亡法律^怎么办 高中毕业申请国外大学没录取怎么办 英国研究生老师没给写推荐信怎么办 申请悉尼大学博士奖学金被拒怎么办 硕士延迟毕业但被博士录取怎么办 考完初级职称还是不会做账怎么办 美国留学生在中国办日本签证怎么办 留学雅思过了gpa低怎么办澳洲 护士电子化注册用户名忘记了怎么办 护士电子化注册证书编码错误怎么办 澳洲预科上半学期成绩不达标怎么办 美国大学绩点不够怎么办学习证明 研一想换导师导师不答应怎么办 日本留学在留下来不想去了怎么办 加拿大工签3年到期了怎么办 鞋子穿久了会有臭味怎么办 考研忘了自己填写的通讯地址怎么办 基础教育教师培训网注册错了怎么办