Hdu 1325 Is It ATree? -- 树形 (并查集,入度出度)
2013-09-30 11:03
387 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1325
题意:给一些有向边,判断是否是一棵树
分析:1>将边看成无向边,用并查集判断是否成树形,边数==点数-1。
2>根据有向边记录每个结点的出入度,有向树里只有1个入度为0的点。
题意:给一些有向边,判断是否是一棵树
分析:1>将边看成无向边,用并查集判断是否成树形,边数==点数-1。
2>根据有向边记录每个结点的出入度,有向树里只有1个入度为0的点。
#include <stdio.h> #include <string.h> const int MAX = 1005; int ind[MAX],oud[MAX]; int parent[1005]; int tree[1005]; int root(int v) { if(parent[v]==0) return v; else return parent[v]=root(parent[v]); } int main() { int edge,node; int a,b,i,k=1; int j=0,all = 0; edge=0;node=0; memset(parent,0,sizeof(parent)); memset(tree,0,sizeof(tree)); memset(ind,0,sizeof(ind)); memset(oud,0,sizeof(oud)); while(scanf("%d %d",&a,&b)!=EOF) { if(a+b !=0){ tree[all++]=a; tree[all++]=b; ind[b]++; oud[a]++; } if(a<0) break; else if(node==0&&edge==0&&a==0&&b==0) { printf("Case %d is a tree.\n",k++); memset(parent,0,sizeof(parent)); memset(tree,0,sizeof(tree)); memset(ind,0,sizeof(ind)); memset(oud,0,sizeof(oud)); edge=0;node=0;all=0; continue; } else if(a==0&&b==0) { for(j=0;j<all;j++) { for(i=j+1;i<all;i++) { if(tree[j]==tree[i]) tree[i]=0; } } int num=0; for(j=0;j<all;j++) { if(tree[j]!=0) { if(ind[tree[j]] == 0)num++; node++; } } if(edge==node-1&&num==1) { printf("Case %d is a tree.\n",k++); } else printf("Case %d is not a tree.\n",k++); memset(parent,0,sizeof(parent)); memset(ind,0,sizeof(ind)); memset(oud,0,sizeof(oud)); memset(tree,0,sizeof(tree)); edge=0;node=0;all=0; } else { int pa,pb; pa = root(a); pb = root(b); if(pa!=pb) parent[pa] = pb; edge++; } } return 0; }
相关文章推荐
- 纯jsp打造无限层次的树代码
- ExtJS 4 树
- 数据库表TreeView树的快速生成
- Android树状列表实现
- 数据结构基础攻略——树(Tree)
- iOS 解析xml之——将XML转化为树demo
- 二叉搜索树转换为双向链表 binary search tree to double-linked list
- 面试只Trie树特点和应用场景
- POJ2418-Hardwood Species
- 树的定义definition
- Forest
- 数据结构学习之_二叉树的遍历
- 11.求二叉树中节点的最大距离
- 9.判断整数序列是不是二元查找树的后序遍历结果
- Same Tree
- Symmetric Tree
- Maximum Depth of Binary Tree
- Path Sum
- path sumII
- Sum Root to Leaf Numbers