将树转换为偶数节点的森林
给定一棵有n 个偶数节点的树。任务是找到要从给定树中删除的最大边数,以获得具有偶数个节点的树的森林。这个问题总是可以解决的,因为给定的图有偶数节点。
例子:
Input : n = 10
Edge 1: 1 3
Edge 2: 1 6
Edge 3: 1 2
Edge 4: 3 4
Edge 5: 6 8
Edge 6: 2 7
Edge 7: 2 5
Edge 8: 4 9
Edge 9: 4 10
Output : 2
By removing 2 edges we can obtain the forest with even node tree.
Dotted line shows removed edges. Any further removal of edge will not satisfy
the even nodes condition.
找到具有偶数个节点的子树,并通过删除连接它的边将其从树的其余部分中删除。删除后,我们只剩下带有偶数节点的树,因为最初我们在树中有偶数个节点,并且删除的子树也有偶数节点。重复相同的过程,直到我们留下无法以这种方式进一步分解的树。
为此,想法是使用深度优先搜索来遍历树。以这样的方式实现 DFS函数,它将返回子树中的节点数,其根是执行 DFS 的节点。如果节点数是偶数,则删除边缘,否则忽略。
下面是这种方法的实现:
C++
// C++ program to find maximum number to be removed
// to convert a tree into forest containing trees of
// even number of nodes
#include
#define N 12
using namespace std;
// Return the number of nodes of subtree having
// node as a root.
int dfs(vector tree[N], int visit[N],
int *ans, int node)
{
int num = 0, temp = 0;
// Mark node as visited.
visit[node] = 1;
// Traverse the adjacency list to find non-
// visited node.
for (int i = 0; i < tree[node].size(); i++)
{
if (visit[tree[node][i]] == 0)
{
// Finding number of nodes of the subtree
// of a subtree.
temp = dfs(tree, visit, ans, tree[node][i]);
// If nodes are even, increment number of
// edges to removed.
// Else leave the node as child of subtree.
(temp%2)?(num += temp):((*ans)++);
}
}
return num+1;
}
// Return the maximum number of edge to remove
// to make forest.
int minEdge(vector tree[N], int n)
{
int visit[n+2];
int ans = 0;
memset(visit, 0, sizeof visit);
dfs(tree, visit, &ans, 1);
return ans;
}
// Driven Program
int main()
{
int n = 10;
vector tree[n+2];
tree[1].push_back(3);
tree[3].push_back(1);
tree[1].push_back(6);
tree[6].push_back(1);
tree[1].push_back(2);
tree[2].push_back(1);
tree[3].push_back(4);
tree[4].push_back(3);
tree[6].push_back(8);
tree[8].push_back(6);
tree[2].push_back(7);
tree[7].push_back(2);
tree[2].push_back(5);
tree[5].push_back(2);
tree[4].push_back(9);
tree[9].push_back(4);
tree[4].push_back(10);
tree[10].push_back(4);
cout << minEdge(tree, n) << endl;
return 0;
}
Java
// Java program to find maximum number to be removed
// to convert a tree into forest containing trees of
// even number of nodes
import java.util.*;
class GFG
{
static int N = 12,ans;
static Vector> tree=new Vector>();
// Return the number of nodes of subtree having
// node as a root.
static int dfs( int visit[], int node)
{
int num = 0, temp = 0;
// Mark node as visited.
visit[node] = 1;
// Traverse the adjacency list to find non-
// visited node.
for (int i = 0; i < tree.get(node).size(); i++)
{
if (visit[tree.get(node).get(i)] == 0)
{
// Finding number of nodes of the subtree
// of a subtree.
temp = dfs( visit, tree.get(node).get(i));
// If nodes are even, increment number of
// edges to removed.
// Else leave the node as child of subtree.
if(temp%2!=0)
num += temp;
else
ans++;
}
}
return num+1;
}
// Return the maximum number of edge to remove
// to make forest.
static int minEdge( int n)
{
int visit[] = new int[n+2];
ans = 0;
dfs( visit, 1);
return ans;
}
// Driven Program
public static void main(String args[])
{
int n = 10;
//set the size of vector
for(int i = 0; i < n + 2;i++)
tree.add(new Vector());
tree.get(1).add(3);
tree.get(3).add(1);
tree.get(1).add(6);
tree.get(6).add(1);
tree.get(1).add(2);
tree.get(2).add(1);
tree.get(3).add(4);
tree.get(4).add(3);
tree.get(6).add(8);
tree.get(8).add(6);
tree.get(2).add(7);
tree.get(7).add(2);
tree.get(2).add(5);
tree.get(5).add(2);
tree.get(4).add(9);
tree.get(9).add(4);
tree.get(4).add(10);
tree.get(10).add(4);
System.out.println( minEdge( n));
}
}
// This code is contributed by Arnab Kundu
Python3
# Python3 program to find maximum
# number to be removed to convert
# a tree into forest containing trees
# of even number of nodes
# Return the number of nodes of
# subtree having node as a root.
def dfs(tree, visit, ans, node):
num = 0
temp = 0
# Mark node as visited.
visit[node] = 1
# Traverse the adjacency list
# to find non-visited node.
for i in range(len(tree[node])):
if (visit[tree[node][i]] == 0):
# Finding number of nodes of
# the subtree of a subtree.
temp = dfs(tree, visit, ans,
tree[node][i])
# If nodes are even, increment
# number of edges to removed.
# Else leave the node as child
# of subtree.
if(temp % 2):
num += temp
else:
ans[0] += 1
return num + 1
# Return the maximum number of
# edge to remove to make forest.
def minEdge(tree, n):
visit = [0] * (n + 2)
ans = [0]
dfs(tree, visit, ans, 1)
return ans[0]
# Driver Code
N = 12
n = 10
tree = [[] for i in range(n + 2)]
tree[1].append(3)
tree[3].append(1)
tree[1].append(6)
tree[6].append(1)
tree[1].append(2)
tree[2].append(1)
tree[3].append(4)
tree[4].append(3)
tree[6].append(8)
tree[8].append(6)
tree[2].append(7)
tree[7].append(2)
tree[2].append(5)
tree[5].append(2)
tree[4].append(9)
tree[9].append(4)
tree[4].append(10)
tree[10].append(4)
print(minEdge(tree, n))
# This code is contributed by pranchalK
C#
// C# program to find maximum number
// to be removed to convert a tree into
// forest containing trees of even number of nodes
using System;
using System.Collections.Generic;
class GFG
{
static int N = 12, ans;
static List> tree = new List>();
// Return the number of nodes of
// subtree having node as a root.
static int dfs(int []visit, int node)
{
int num = 0, temp = 0;
// Mark node as visited.
visit[node] = 1;
// Traverse the adjacency list to
// find non-visited node.
for (int i = 0; i < tree[node].Count; i++)
{
if (visit[tree[node][i]] == 0)
{
// Finding number of nodes of the
// subtree of a subtree.
temp = dfs(visit, tree[node][i]);
// If nodes are even, increment number of
// edges to removed.
// Else leave the node as child of subtree.
if(temp % 2 != 0)
num += temp;
else
ans++;
}
}
return num + 1;
}
// Return the maximum number of edge
// to remove to make forest.
static int minEdge(int n)
{
int []visit = new int[n + 2];
ans = 0;
dfs(visit, 1);
return ans;
}
// Driver Code
public static void Main(String []args)
{
int n = 10;
//set the size of vector
for(int i = 0; i < n + 2;i++)
tree.Add(new List());
tree[1].Add(3);
tree[3].Add(1);
tree[1].Add(6);
tree[6].Add(1);
tree[1].Add(2);
tree[2].Add(1);
tree[3].Add(4);
tree[4].Add(3);
tree[6].Add(8);
tree[8].Add(6);
tree[2].Add(7);
tree[7].Add(2);
tree[2].Add(5);
tree[5].Add(2);
tree[4].Add(9);
tree[9].Add(4);
tree[4].Add(10);
tree[10].Add(4);
Console.WriteLine(minEdge(n));
}
}
// This code is contributed by Rajput-Ji
Javascript
输出:
2