from
typing
import
List
def
dfs(tree:
List
[
List
[
int
]], degree_of_node:
List
[
int
], parent_of_node:
List
[
int
], child_of_node:
List
[
int
], current:
int
, parent:
int
)
-
>
None
:
parent_of_node[current]
=
parent
for
child
in
tree[current]:
if
child
=
=
parent:
return
dfs(tree, degree_of_node, parent_of_node, child_of_node, child, current)
if
degree_of_node[current]
=
=
1
and
current !
=
1
:
child_of_node[current]
=
0
return
total_child
=
0
for
child
in
tree[current]:
if
child
=
=
parent:
return
else
:
total_child
+
=
1
child_of_node[current]
=
total_child
def
find_nPr(N:
int
, R:
int
)
-
>
int
:
if
R > N:
return
0
total
=
1
for
i
in
range
(N
-
R
+
1
, N
+
1
):
total
*
=
i
return
total
def
NoOfWays(Nodes:
int
, colors:
int
)
-
>
int
:
dfs(tree, degree_of_node, parent_of_node, child_of_node,
1
,
-
1
)
ways
=
0
for
i
in
range
(
1
, Nodes
+
1
):
if
i
=
=
1
:
ways
+
=
colors
*
find_nPr(colors
-
1
, child_of_node[
1
])
else
:
if
degree_of_node[i]
=
=
1
:
continue
else
:
ways
*
=
find_nPr(colors
-
2
, child_of_node[i])
return
ways
def
MakeTree()
-
>
None
:
tree[
2
].append(
1
)
tree[
1
].append(
2
)
tree[
3
].append(
2
)
tree[
2
].append(
3
)
degree_of_node[
2
]
+
=
1
degree_of_node[
1
]
+
=
1
degree_of_node[
3
]
+
=
1
degree_of_node[
2
]
+
=
1
if
__name__
=
=
"__main__"
:
N
=
3
K
=
3
tree
=
[[]
for
_
in
range
(N
+
1
)]
degree_of_node
=
[
0
for
_
in
range
(N
+
1
)]
parent_of_node
=
[
0
for
_
in
range
(N
+
1
)]
child_of_node
=
[
0
for
_
in
range
(N
+
1
)]
MakeTree()
Count
=
NoOfWays(N, K)
print
(Count)