用偶数个节点从树中获取森林
我被卡在代码挑战,我想要一个提示 。
问题 :给你一个树数据结构(没有周期),并被要求去除尽可能多的“边”(连接),创建更小的树,偶数个节点。 这个问题总是可以解决的,因为有偶数个节点和连接。
你的任务是计算删除的边缘。
输入:输入的第一行包含两个整数N和M. N是顶点的数量,M是边的数量。 2 <= N <= 100.接下来的M行包含两个整数ui和vi,它们指定树的边缘。 (基于1的索引)
输出:打印删除的边数。
示例输入
10 9
2 1
3 1
4 3
5 2
6 1
7 2
8 6
9 8
10 8
样本输出:2
说明:在去除边(1,3)和(1,6)时,我们可以得到想要的结果。
我用BFS穿过节点。 首先,分别维护一个数组以存储子节点的总数+1。因此,您可以在此数组中初始分配值为1的所有叶节点。 现在从最后一个节点开始,并计算每个节点的子节点数量。 这将以自下而上的方式工作,存储子节点数量的数组将有助于运行时优化代码。
一旦获得所有节点的子节点数后得到数组,只需计算节点数为偶数的节点即可得出答案。 注意:在最后一步中,我没有包含根节点。
这是我的解决方案。 我没有使用bfs树,只是分配了另一个数组来存放每个节点和他们的子节点总数。
import java.util.Scanner;
import java.util.Arrays;
public class Solution {
public static void main(String[] args) {
int tree[];
int count[];
Scanner scan = new Scanner(System.in);
int N = scan.nextInt(); //points
int M = scan.nextInt();
tree = new int[N];
count = new int[N];
Arrays.fill(count, 1);
for(int i=0;i<M;i++)
{
int u1 = scan.nextInt();
int v1 = scan.nextInt();
tree[u1-1] = v1;
count[v1-1] += count[u1-1];
int root = tree[v1-1];
while(root!=0)
{
count[root-1] += count[u1-1];
root = tree[root-1];
}
}
System.out.println("");
int counter = -1;
for(int i=0;i<count.length;i++)
{
if(count[i]%2==0)
{
counter++;
}
}
System.out.println(counter);
}
}
如果你观察输入,你可以看到很容易计算每个节点下的节点数量。 考虑(ab)作为边缘输入,在每种情况下,a是孩子,b是直接父母。 输入始终具有自底向上的边缘。
所以它基本上是有偶数的节点的数量(排除根节点)。 我在Hackerrank上提交了下面的代码,并通过了所有测试。 我猜想输入中的所有情况都符合规则。
def find_edges(count):
root = max(count)
count_even = 0
for cnt in count:
if cnt % 2 == 0:
count_even += 1
if root % 2 == 0:
count_even -= 1
return count_even
def count_nodes(edge_list, n, m):
count = [1 for i in range(0, n)]
for i in range(m-1,-1,-1):
count[edge_list[i][1]-1] += count[edge_list[i][0]-1]
return find_edges(count)
链接地址: http://www.djcxy.com/p/63795.html
上一篇: Obtain forest out of tree with even number of nodes
下一篇: What's the difference between the data structure Tree and Graph?