C++で2部グラフを維持するためにツリーに追加されるエッジの最大数
問題の説明
ツリーは常に2部グラフです。これは、レベルが交互になっている2つの互いに素なセットにいつでも分割できるためです。
つまり、交互のレベルが同じ色になるように、常に2つの色で色付けします。タスクは、最大数を計算することです。 2部グラフのままにするためにツリーに追加できるエッジの数。
例
ツリーエッジは、次のように頂点ペアで表されます-
{1、2}
{1、3}
{2、4}
{3、5}次に、2部グラフを維持するためにさらに2つのエッジが必要です
- 彩色グラフでは、2つの異なるセットからのグラフ{1、4、5}と{2、3}。以来、1は2と3の両方から接続されています
- エッジ4と5が残っています。4はすでに2と5から3に接続されているため、残りのオプションは{4、3}と{5、2}のみです。
アルゴリズム
- グラフの単純なDFSまたはBFSトラバーサルを実行し、2色で色付けします
- カラーリングは、2色でカラーリングされたノードの数も追跡します。 2つのカウントをcount_color0とcount_color1とします
- これで、2部グラフが持つことができる最大エッジはcount_color0 x count_color1 であることがわかりました。
- ノードがn個あるツリーにはエッジがn-1個あることもわかっています
- つまり、私たちの答えはcount_color0 x count_color1 –(n-1) です。
例
#include <bits/stdc++.h> using namespace std; long long count_color[2]; void dfs(vector<int> graph[], int node, int parent, int color) { ++count_color[color]; for (int i = 0; i < graph[node].size(); ++i) { if (graph[node][i] != parent) { dfs(graph, graph[node][i], node, !color); } } } int getMaxEdges(vector<int> graph[], int n) { dfs(graph, 1, 0, 0); return count_color[0] * count_color[1] - (n - 1); } int main() { int n = 5; vector<int> graph[n + 1]; graph[1].push_back(2); graph[1].push_back(3); graph[2].push_back(4); graph[3].push_back(5); cout << "Maximum edges = " << getMaxEdges(graph, n) << endl; return 0; }
出力
上記のプログラムをコンパイルして実行する場合。次の出力を生成します-
Maximum edges = 2
-
C++のツリー内の2つの交差しないパスの最大積
この問題では、n個のノードを持つ無向接続ツリーTが与えられます。私たちのタスクは、C++のツリー内の2つの交差しないパスの最大積を見つけるプログラムを作成することです。 問題の説明 −ツリー内の交差しない2つのパスの最大積を見つける。興味のないすべてのパスを見つけてから、それらの長さの積を見つけます。 問題を理解するために例を見てみましょう 入力 グラフ- 出力 8 説明 考慮される交差しないパスはC-A-B およびF-E-D-G-H 。 長さは2と4です。Product=8。 ソリューションアプローチ この問題の解決策は、DFSを使用してツリーをトラバースすることです。そ
-
C++の無向グラフのエッジの数を数えます
与えられたタスクは、無向グラフのエッジの数を数えることです。無向グラフは、すべてのエッジが双方向であるグラフを形成するために互いに接続されている頂点のセットです。無向グラフは、あるノードから別の接続されたノードへと任意の方向に移動できます。 以下は、無向グラフの視覚的表現です。 ここで、問題に応じて、無向グラフのエッジの数を見つける必要があります。 グラフのエッジは、2つの頂点が結合されている線です。 入力 − insert(graph_list, 0, 1); insert(graph_list, 0, 2); insert(graph_list, 1, 2); insert