小红书 4.9 实习笔试第一题

笔试第一题一看就不会输入输出了,到现在都没用树把这题实现,晚上采用哈希和深度优先搜寻实现了,大佬知道怎么用树实现可以发给我看看

#include
#include
#include
using namespace std;
unordered_map> map;
int dfs(int n)
{
if(map[n].size()==0) return 1;
else
{
if(map[n].size()==1)
{
return 1+dfs(map[n][0]);
}
if(map[n].size()==2)
{
return 1+dfs(map[n][0])+dfs(map[n][1]);
}
}
return 0;
}

int main()
{

int n;
cin>>n;
for(int i=1;i{
int a,b;
cin>>a>>b;
map[b].push_back(a);
}
vector res(n+1,0);
for(int i=1;i{
cout<int a=dfs(i);
int b=n-dfs(i);
int cha;
if(a-b>0)
{
cha=a-b;
}
else
{
cha=b-a;
}
res[cha]++;
}
cout<for(int i=0;i{
if(res[i]!=0)
{
cout<}
}
return 0;
}
全部评论
题目描述: 输入一棵树 T,你需要删除一条边,这棵树会被分成A 和 B 两棵树。你需要让两部分的节点数的差的绝对值| |A|-|B| |尽可能小。输出最小的| |A|-|B| |和最优方案的数量。 输入描述 第一行一个整数 n表示节点的数量,节点从1 到 n编号。 接下来n-1行每行两个正整数 s t,表示s的父亲是t。 输入保证是一棵树。 对于所有数据 1<=n<=100000。 输出描述 输出一行,两个整数,用空格分开,分别表示最优解和最优方案数。 样例输入 3 2 1 3 1 样例输出 1 2 */
1 回复 分享
发布于 2023-04-09 22:19 重庆
谁说这是二叉树了。。。
1 回复 分享
发布于 2023-04-10 12:38 四川
从根节点开始递归求出每个子树的节点个数,然后就好做了。
点赞 回复 分享
发布于 2023-04-10 00:31 安徽

相关推荐

无敌虾孝子:喜欢爸爸还是喜欢妈妈
点赞 评论 收藏
分享
死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
评论
点赞
2
分享
牛客网
牛客企业服务