mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-01-18 16:27:02 +00:00
Merge pull request #204 from erdenezul/even_tree_problem
add even tree problem
This commit is contained in:
commit
a03b2eafc0
69
data_structures/Graph/even_tree.py
Normal file
69
data_structures/Graph/even_tree.py
Normal file
|
@ -0,0 +1,69 @@
|
|||
"""
|
||||
You are given a tree(a simple connected graph with no cycles). The tree has N
|
||||
nodes numbered from 1 to N and is rooted at node 1.
|
||||
|
||||
Find the maximum number of edges you can remove from the tree to get a forest
|
||||
such that each connected component of the forest contains an even number of
|
||||
nodes.
|
||||
|
||||
Constraints
|
||||
2 <= 2 <= 100
|
||||
|
||||
Note: The tree input will be such that it can always be decomposed into
|
||||
components containing an even number of nodes.
|
||||
"""
|
||||
# pylint: disable=invalid-name
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
def dfs(start):
|
||||
"""DFS traversal"""
|
||||
# pylint: disable=redefined-outer-name
|
||||
ret = 1
|
||||
visited[start] = True
|
||||
for v in tree.get(start):
|
||||
if v not in visited:
|
||||
ret += dfs(v)
|
||||
if ret % 2 == 0:
|
||||
cuts.append(start)
|
||||
return ret
|
||||
|
||||
|
||||
def even_tree():
|
||||
"""
|
||||
2 1
|
||||
3 1
|
||||
4 3
|
||||
5 2
|
||||
6 1
|
||||
7 2
|
||||
8 6
|
||||
9 8
|
||||
10 8
|
||||
On removing edges (1,3) and (1,6), we can get the desired result 2.
|
||||
"""
|
||||
dfs(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
n, m = 10, 9
|
||||
tree = defaultdict(list)
|
||||
visited = {}
|
||||
cuts = []
|
||||
count = 0
|
||||
edges = [
|
||||
(2, 1),
|
||||
(3, 1),
|
||||
(4, 3),
|
||||
(5, 2),
|
||||
(6, 1),
|
||||
(7, 2),
|
||||
(8, 6),
|
||||
(9, 8),
|
||||
(10, 8),
|
||||
]
|
||||
for u, v in edges:
|
||||
tree[u].append(v)
|
||||
tree[v].append(u)
|
||||
even_tree()
|
||||
print len(cuts) - 1
|
Loading…
Reference in New Issue
Block a user