soj 1034 Forest_求树的深度和宽度

题目链接

题意:给你n个节点,m条边,每条边是有向的,这颗树不能有自环,问这颗树的深度和宽度

思路:

不合法情况

1,入度大于1,即存在两条指向同一顶点的边

2,一条入点和出点都相同的边

3,一条变得入点和出点深度已知,但不符合出点的深度是入点的深度加1

4,点入深度未知但出点深度已知

5,遍历完以后,有顶点未遍历,说明有多个根

树的宽度是指,同一层最多有多少个节点

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 110
int n,m,edge[MAXN][2],indegree[MAXN],level[MAXN];
int main(int argc, char** argv) {
	int i,j,ok,doit,a,b;
	while(scanf("%d%d",&n,&m)!=EOF,n){
		ok=1;
		for(i=0;i<=n;i++){
			indegree[i]=0;
			level[i]=-1;
		}
		for(i=1;i<=m;i++){
			scanf("%d%d",&a,&b);
			if(a==b) ok=0;
			edge[i][0]=a;
			edge[i][1]=b;
			indegree[b]++;
			if(indegree[b]>1) ok=0;
		}
		for(i=1;i<=n;i++)
			if(!indegree[i])
				level[i]=0;
		doit=1;
		while(doit&&ok){
			doit=0;
			for(i=1;i<=m;i++){
				a=edge[i][0];
				b=edge[i][1];
				if(level[a]>=0){
					if(level[b]>=0){
						if(level[a]+1!=level[b]){
							ok=0;
							break;
						}

					}else{
						level[b]=level[a]+1;
						doit=1;
					}
				}else{
					if(level[b]>=0) {
						ok=0;
						break;
					}
				}
			}
		}
		for(i=1;i<=n;i++)
			if(level[i]<0) ok=0;
		if(!ok){
			printf("INVALID\n");
			continue;
		}
		int depth=-1,width=-1,sum[110];
		memset(sum,0,sizeof(sum));
		for(i=1;i<=n;i++){
			if(level[i]>depth)depth=level[i];
			sum[level[i]]++;
			if(sum[level[i]]>width) width=sum[level[i]]; 

		}
		printf("%d %d\n",depth,width);
	}
	return 0;
}

soj 1034 Forest_求树的深度和宽度,布布扣,bubuko.com

时间: 2024-10-12 11:12:14

soj 1034 Forest_求树的深度和宽度的相关文章

广度优先搜索求树的深度

#include<iostream> #include<vector> #include<stack> #include<string> #include<queue> #include<algorithm> #include<numeric> using namespace std; class node{ public: int val; node* left; node* right; node():val(0),l

PAT-1021 Deepest Root (25 分) 并查集判断成环和联通+求树的深度

A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root. Input Specification: E

[华为机试练习题]42.求二叉树的深度和宽度

题目 题目标题: 求二叉树的宽度和深度 给定一个二叉树,获取该二叉树的宽度和深度. 例如输入 a / b c / \ / d e f g 返回3. 接口说明 原型: int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight) 输入参数: head 需要获取深度的二叉树头结点 输出参数(指针指向的内存区域保证有效): pulWidth 宽度 pulHeight 高度 返回值: 0 成功 1 失败或

求树的深度(通解)

树的深度求解 递归方法求深度 寻找递归的条件: 解题思路: (1)如果树只有一个结点,则树的深度为1.       (2)如果根结点只有左子树或者只有右子树,那么这棵树的深度是其根结点的左子树的深度再加1.   (3)如果根结点既有左子树又有右子树,那么这棵树的深度是左子树深度与右子树深度的最大值再加1. int GetTreeDepth(BiTree &T) { if (!T) { return 0; } int left = GetTreeDepth(BiTree T->lchild);

LeetCode Maximum Depth of Binary Tree (求树的深度)

题意:给一棵二叉树,求其深度. 思路:递归比较简洁,先求左子树深度,再求右子树深度,比较其结果,返回:max_one+1. 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 *

求二叉树的深度和宽度 ----我对默认构造函数的理解

////计算二叉树的深度和宽度:深度:层数   宽度:各层最大节点数 ///关于二叉树问题,一般都要用到递归的方法. ////算法:首先构造二叉树节点的结构:要创建二叉树,创建的过程,使用递归算法:其次,计算二叉树深度,也要递归:最难的一点是计算求出层次中的最大节点数,使用队列的方法 #include <iostream>#include <queue>#include <tchar.h>using namespace std;struct BTNode{ char m

求二叉树的深度和宽度[Java]

这个是常见的对二叉树的操作.总结一下: 设节点的数据结构,如下: 1 class TreeNode { 2 char val; 3 TreeNode left = null; 4 TreeNode right = null; 5 6 TreeNode(char _val) { 7 this.val = _val; 8 } 9 } 1.二叉树深度 这个可以使用递归,分别求出左子树的深度.右子树的深度,两个深度的较大值+1即可. 1 // 获取最大深度 2 public static int get

hdu 4707 Pet【BFS求树的深度】

Pet                                                          Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1909    Accepted Submission(s): 924 链接:pid=4707">Click Me ! Problem Description O

[数据结构]求二叉树的深度与宽度

二叉树数据结构声明: struct TreeNode { int val; TreeNode *left; TreeNode *right; }; 1.递归求二叉树深度 int getDepth(TreeNode *root) { if (root == NULL) { return 0; } return getDepth(root->left) > getDepth(root->right) ?(getDepth(root->left) + 1) : (getDepth(roo