并查集 HDU1325-Is It A Tree?
2015-08-21 10:30
399 查看
题目链接:HDU1325-Is It A Tree?
题意:有多组测试数据,处理到负数出现结束。每组测试数据有多组数,每组数a和b代表a和b相连,且是由a指向b,当a和b均为0是结束一组测试数据,判断之前输入的数据是否是一颗树。
若是树,则必须满足 1:没有环出现。2:只有一个根节点。3:每个点的入度为不大于1.
思路:并查集算法。代码里有解释
代码:
关于并查集,我推荐一篇博客,个人认为写的非常好:/article/2376314.html
题意:有多组测试数据,处理到负数出现结束。每组测试数据有多组数,每组数a和b代表a和b相连,且是由a指向b,当a和b均为0是结束一组测试数据,判断之前输入的数据是否是一颗树。
若是树,则必须满足 1:没有环出现。2:只有一个根节点。3:每个点的入度为不大于1.
思路:并查集算法。代码里有解释
代码:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAXN = 111111; int Father[MAXN],Mark[MAXN],Degree[MAXN];//Mark[i]用于标记数字i是否出现过。Degree[i]用于记录i的入度,可粗略的理解为子节点出现的次数 int flag,ans; void Initial() { memset(Mark,0,sizeof(Mark)); memset(Degree,0,sizeof(Degree)); flag=ans=0; for(int i=0;i<MAXN;i++)//初置父节点为自身 Father[i]=i; } int Find(int x)//查找终父节点 { int r=x; while(Father[r]!=r)r=Father[r]; return r; } void Union(int x,int y) { // if(x==y)return; // Father[y]=x; int xx=Find(x),yy=Find(y); if(xx==yy)return; Father[yy]=xx;//只能有一个方向,从xx指向yy } int main() { int a,b; int Case=0; Initial(); while(~scanf("%d%d",&a,&b) && (a>=0 && b>=0)) { if(a==0 && b==0)//处理到a=0且b=0输出之前输入的结果 { for(int i=1;i<MAXN;i++) { if(ans>1)//若有两个根节点则不是树 { flag=1; break; } if(Mark[i] && Find(i)==i)//若i读入过,且根节点是他自己,则根节点的数目加一 ans++; if(Degree[i]>1)//判断是否有入度大于一的数字出现 ,出现则不是树 { flag=1; break; } } if(flag==1) printf("Case %d is not a tree.\n",++Case); else printf("Case %d is a tree.\n",++Case); Initial(); continue; } if(a!=b && Find(a) == Find(b))flag=1;//判断是否成环 Mark[a]=Mark[b]=1;//标记i已经读入 Degree[b]++;//b的入度加一,也就是b成为儿子的次数 Union(a,b); } return 0; }
关于并查集,我推荐一篇博客,个人认为写的非常好:/article/2376314.html
相关文章推荐
- oracle中字符中有数字的判断
- 黑马程序员-assign、retain、release、nonatomic、atomic、strong、weak
- HDU 5082 Love
- java调用mysql的存储过程
- SQLAlchemy 学习(一)
- poj 1068 Parencodings
- 排错记录:plsql无法连接oracle ora-12154 ora-12560
- MyEclipse、Eclipse SVN插件的帐号、密码修改
- 使用SQL脚本访问操作远程数据库
- android--textView添加html超链接响应
- 学习Spring笔记_Annotation(注解)_Component
- 中国人靠手机享受丰富生活?你没看到背后的折腾
- 亿级Web系统搭建——单机到分布式集群
- 接口函数开发总结
- 关于Android中fragment中创建popwindow全屏显示时手机状态遮挡popwindow的问题
- POJ 2312 Battle City BFS+优先队列
- VS错误 FileTracker : error FTK1011:
- 解决使用findnext相关函数在64位编译环境下遍历文件夹下的文件
- tar 命令
- [转] 自定义取色函数