题目描述:求森林的最大深度与最大宽度
大概讲一下个人的思路:
①求每一棵树是否有回路;如果有输出INVALID,如果没有往下求宽度深度
②关于求是否存在回路可以使用并查集
③求深度与宽度,遍历每一个顶点就好
附个人代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
int father[110];//设置头结点所在地
int se_father[110];//设置附属
int height[110];//设置每一棵树的深度
//找到每一个结点的祖先
int find_father(int i)
{
int fa = se_father[i] ;
if (fa == 0)
{
return i ;
}
else
{
return (se_father[i] = find_father(fa)) ;
}
}
//找到最大深度
int getlevel(int i)
{
if ( height[i] != 0 )
{
return height[i] ;
}
int temp = father[i] ;
if (temp == 0)
{
return ( height[i] = 1 );
}
else
{
return ( height[i] = getlevel(temp) + 1 ) ;
}
}
int main()
{
int n = 0 ;
int m = 0 ;
while ( cin >> n >> m && ( n != 0 ) )
{
bool judge = false ;
memset(father, 0 , sizeof(father)) ;//初始化结点
memset(se_father , 0 , sizeof(se_father)) ; //初始化附属
memset(height, 0 , sizeof(height)) ;//初始化深度
for (int i = 0 ; i < m ; i ++ )
{
int first_number = 0 ;
int seconde_number = 0 ;
cin >> first_number >> seconde_number ;
int fx = find_father(first_number) ;
int fy = find_father(seconde_number) ;
// cout << find_father(find_father) << " " << find_father(seconde_number) << endl ;
if (judge)
{
continue ;
}
if (fx == fy || fy != seconde_number )
{
cout << "INVALID" << endl ;
judge = true ;
continue ;
}
father[seconde_number] = first_number ;//把第二个结点的直接父亲设置为第一个结点
se_father[seconde_number] = find_father(first_number) ;//把第二个结点的祖先设置为第一个结点的祖先
}
if ( judge != true )
{
int width[110] = {0} ;
int max_width = 0 ;
int max_height = 0 ;
for (int i = 1 ; i <= n ; i++ )
{
int t = getlevel(i) ;//找出当前结点最大深度
if ( t > max_height )
{
max_height = t ;
}
width[t] ++ ;
}
for (int i = 0 ; i < 110 ; i ++ )
{
if (width[i] > max_width)
{
max_width = width[i] ;
}
}
cout << max_height - 1 << " " << max_width << endl ;
}
}
}