Pythonで指定された頂点の次数が木(ツリー)を表すかグラフを表すかを判定する方法
問題の概要
いくつかの頂点に対する次数(degree)のリストが与えられたとき、そのリストが木(ツリー)を表しているのか、それとも一般的なグラフを表しているのかを判定する問題を考えます。
例えば、入力として deg = [2,2,3,1,1,1] が与えられた場合、出力は「Tree」となります。

判定のアルゴリズム
この問題は、次の手順で解くことができます。
- vert: 頂点の数を取得する
- deg_sum: すべての頂点の次数の合計を計算する
- もし 2 × (vert − 1) が deg_sum と等しければ「Tree」を返す
- そうでなければ「Graph」を返す
この判定が成り立つ理由
グラフ理論における握手の補題(Handshaking Lemma)によると、グラフのすべての頂点の次数の総和は、辺の数のちょうど2倍になります。一方、木とは連結かつ閉路(サイクル)を持たないグラフであり、n 個の頂点を持つ木の辺の数は必ず n − 1 本です。
したがって、次数の合計が 2 × (n − 1) と一致すれば、そのグラフは n − 1 本の辺を持つことになり、木であると判定できます。逆に一致しない場合は木にはなり得ないため、「Graph」と判定されます。
サンプルコード
理解を深めるために、以下のPythonの実装を見てみましょう。
def solve(deg):
vert = len(deg)
deg_sum = sum(deg)
if 2 * (vert - 1) == deg_sum:
return 'Tree'
return 'Graph'
deg = [2, 2, 3, 1, 1, 1]
print(solve(deg))入力
[2,2,3,1,1,1]
出力
Tree
-
Pythonで与えられたグラフが2部グラフかどうかを判定するプログラム
2部グラフとは無向グラフが与えられたとき、そのグラフが2部グラフ(バイパータイトグラフ)であるかどうかを判定する方法を解説します。2部グラフとは、グラフのすべての頂点を2つの集合 A と B に分割でき、グラフ内のすべての辺 {u, v} が必ず一方の端点 u が集合 A、もう一方の端点 v が集合 B に属するようなグラフのことです。つまり、同じ集合内の頂点同士を結ぶ辺(A-A や B-B)が一切存在しないグラフです。例として、次のようなグラフを考えてみましょう。この場合、頂点 [0, 4] を集合 A に、[1, 2, 3] を集合 B に分類できます。すべての辺は A から B、または
-
Pythonで二分木がヒープ(最大ヒープ)かどうかを判定する方法
この記事では、与えられた二分木がヒープ(最大ヒープ)であるかどうかをPythonで判定するアルゴリズムを解説します。再帰処理を使って「完全二分木であること」と「親子間の大小関係」を効率的にチェックする方法を、実装例とともに見ていきましょう。 ヒープの条件とは? ある二分木がヒープとみなされるためには、次の2つの性質を満たしている必要があります。 完全二分木であること:最後のレベルを除くすべての階層がノードで埋まっている状態になっている 最大ヒープの性質を持つこと:すべての親ノードの値が、その子ノードの値以上である たとえば、次のような木構造が入力として与えられた場合、これらの条件をすべて