并查集树数据结构hdu1325
2015-07-26 10:00
218 查看
我的解法就是去构造了一棵树
以数组的存储方式
数组的值存放节点的根!
排除空树
剩下的就是出现环和多根节点的情况
也就是排除森林和有一个节点多个入度的情况
排除森林就用到了并查集
也就是便利数组让其只有一个根
排除多个入度的情况更简单
就是把这个点插入到数上时
如果这个点已经有了根节点,就出现了两个入度
以数组的存储方式
数组的值存放节点的根!
排除空树
剩下的就是出现环和多根节点的情况
也就是排除森林和有一个节点多个入度的情况
排除森林就用到了并查集
也就是便利数组让其只有一个根
排除多个入度的情况更简单
就是把这个点插入到数上时
如果这个点已经有了根节点,就出现了两个入度
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int sett[1000 + 100],g[1000 + 100]; int find2(int x) { while(x != sett[x] ) x = sett[x]; return x; } int main() { int x,y,flag=1,cases=1; while(scanf("%d%d",&x,&y)){ flag=1; for(int i=1;i<=1000;i++) sett[i]=i; // for(int i=1;i<=1000;i++) g[i]=i; memset(g,0,sizeof(g)); if(x == 0 && y == 0) flag=0; if(x < 0 && y < 0) break; else sett[y]=x; g[x]=1; g[y]=1; while(scanf("%d%d",&x,&y)){ g[x]=1; g[y]=1; if(!x&&!y) break; int fx = sett[x]; int fy = sett[y]; if( fy != y) //out circle and two roots flag=0; else sett[fy]=fx; } int countt=0; for(int i=1;i<=1000;i++) if(g[i]&&sett[i]==i) countt++; // printf("countt %d\n",countt); if(countt > 1) flag=0; // printf("flag %d\n",flag if(flag) printf("Case %d is a tree.\n",cases); else printf("Case %d is not a tree.\n",cases); cases++; // for(int i=1;i<=10;i++) // printf("%d ",i); // printf("\n"); // for(int i=1;i<=10;i++) // printf("%d ",sett[i]); // printf("\n"); } return 0; }
相关文章推荐
- 用两个队列模拟一个栈
- 初学数据结构之二叉树
- 课程笔记 11:数据结构(清华) 栈与队列
- 课程笔记 10:数据结构(清华) 栈
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构+算法面试100题~~~摘自CSDN,作者July
- 南阳 oj 中缀式变后缀式 题目467 数据结构 NYOj
- 南阳 oj 表达式求值 题目35 数据结构 NYOj
- 数据结构浅析(二)
- java数据结构之栈
- HDU 2203 - 亲和串
- HDU 4628 Pieces (状压DP)
- HDU 数据结构 - 字典树 解题报告汇总
- 数据结构——Currency System in Geraldion
- 数据结构基础温故-5.图(上):图的基本概念
- Vector、ArrayList和Hashtable、HashMap数据结构(转)
- 2.6静态链表
- 2.6静态链表
- 2.6静态链表
- 2.6静态链表