C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でN頂点の2部グラフが持てる最大の辺数を求める方法

問題文

頂点の数を表す整数 N が与えられます。このとき、N 個の頂点からなる2部グラフ(バイパータイトグラフ)に含められる最大の辺数を求めるのが課題です。

2部グラフとは

2部グラフとは、頂点が2つの集合に分けられたグラフのことです。重要な性質として、同じ集合に属する頂点同士は決して辺で結ばれません。すべての辺は、必ず片方の集合の頂点ともう片方の集合の頂点を結びます。

具体例

N = 10 の場合を考えてみましょう。このとき最大で 25 本の辺が存在できます。

  • 両方の集合にそれぞれ 5 つの頂点が入り、第1集合のすべての頂点が、第2集合のすべての頂点と辺で結ばれます。
  • したがって、総辺数は 5 × 5 = 25 本となります。

アルゴリズム

  • 辺数が最大になるのは、一方の集合のすべての頂点が、もう一方の集合のすべての頂点と辺で結ばれる場合です。つまり、辺数 = m × n(m、n はそれぞれの集合の頂点数)となります。
  • 積 m × n を最大化するには、m を n と等しくするか、できるだけ近い値にする必要があります。これは「和が一定のとき、2つの数が等しいほど積は大きくなる」という性質によるものです。
  • したがって、最大辺数は次の式で計算できます。

(N × N) / 4

N が奇数の場合も、整数除算(切り捨て)によって正しく処理されます。例えば N = 7 の場合は、7 × 7 / 4 = 12.25 → 12 本となります。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int getMaxEdges(int n) {
return floor((n * n) / 4);
}
int main() {
int n = 7;
cout << "Maximum edges = " << getMaxEdges(n) << endl;
return 0;
}

出力結果

上記のプログラムをコンパイルして実行すると、以下の出力が得られます。

Maximum edges = 12

まとめ

N 頂点の2部グラフにおける最大辺数は、頂点をできるだけ均等に2つの集合へ分割することで実現でき、公式 (N × N) / 4 を使えば O(1) で即座に計算できます。

  1. 二分木で屈曲数が最大となるパスの長さを求めるC++プログラム

    本記事では、二分木が与えられたときに、屈曲数が最大となるパスを求める問題を解いていきます。ここで「屈曲(ベンド)」とは、パスの進行方向が左から右へ、または右から左へと切り替わる箇所のことです。具体例を見てみましょう。入力 −出力 −6この方法では、木を走査しながら直前の移動方向を記録していきます。方向が変化した時点で屈曲数を加算し、最終的にその最大値を求めます。解法のアプローチこのアプローチでは、すべてのパスを辿り、各パスにおける屈曲の総数を計算します。葉ノードに到達した時点で、これまでの屈曲数が現在の最大値を上回っていれば、答えとパスの長さを新しい値に更新します。C++による実装例#incl

  2. C++で無向グラフの辺(エッジ)の数を数える方法

    無向グラフと辺の数を数える問題今回の課題は、無向グラフに含まれる辺の数を数えることです。無向グラフとは、複数の頂点(ノード)を双方向の辺で結んで構成されるグラフのことで、あるノードから接続先のノードへ、どちらの方向にも移動できるのが特徴です。下図は無向グラフを視覚的に表したものです。この問題では、与えられた無向グラフの中に辺が何本あるかを求めます。グラフにおける辺とは、2つの頂点を結ぶ線のことです。入力:insert(graph_list, 0, 1); insert(graph_list, 0, 2); insert(graph_list, 1, 2); insert(graph_list,