C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++でグラフ行列の逆行列を求めるプログラムの実装方法

    本記事では、グラフ行列の逆行列を求めるC++プログラムについて詳しく解説します。行列の逆行列は、対象となる行列が正則(非特異)である場合、すなわち行列式が0ではない場合にのみ存在します。 逆行列を求める手法は複数ありますが、ここでは随伴行列(余因子行列の転置)と行列式を組み合わせて逆行列を計算する方法を紹介します。 アルゴリズムの手順 逆行列を求める際の処理の流れは以下の通りです。 開始 行列の逆行列を求める関数 INV() を定義する。 行列式を計算する関数 DET() を呼び出す。 随伴行列を生成する関数 ADJ() を呼び出す。 次の公式に基づいて逆行

  2. 【C++】DFSを使って有向非巡回グラフ(DAG)のトポロジカルソートを実装する方法

    有向非巡回グラフ(DAG:Directed Acyclic Graph)のトポロジカルソートとは、すべての有向辺 u → v において、頂点 u が必ず頂点 v よりも前に配置されるような、頂点の線形順序のことです。グラフが DAG でない場合(閉路を含む場合)、トポロジカルソートは定義上成立しません。本記事では、深さ優先探索(DFS)を再帰的に適用し、探索が完了した頂点をスタックに積んでいくことで、トポロジカルソートを実現する C++ プログラムを解説します。アルゴリズムの流れと擬似コードDFS を利用したトポロジカルソートは、以下の手順で実行します。Begin function t

  3. C++でグラフにハミルトン閉路が存在するかどうかを判定するプログラム

    ハミルトン閉路(Hamiltonian Cycle)とは、グラフ内のすべての頂点をちょうど1回ずつ訪れる閉じた経路のことです。具体的には、ハミルトン経路(Hamiltonian Path)の最後の頂点から最初の頂点へ戻る辺がグラフ中に存在するとき、その経路はハミルトン閉路と呼ばれます。本記事では、無向グラフに対してハミルトン閉路が存在するかどうかをバックトラッキング法で判定するC++プログラムを紹介します。使用する関数とその役割Begin 1. isSafe()関数:追加しようとしている頂点が、直前に追加した頂点と隣接しているか、 まだ経路に含まれていないかを確認します。

  4. 有向グラフが「強連結」か「弱連結」かを判定するC++プログラム(DFSを活用)

    有向グラフが強連結(strongly connected)であるとは、グラフ内の任意の2頂点について、互いに到達可能な経路が存在することを意味します。一方、弱連結(weakly connected)とは、すべての辺の向きを無視した場合にのみ全体がつながっている状態を指します。これらの性質は、DFS(深さ優先探索)を用いて判定できます。具体的には、コサラジュのアルゴリズム(Kosarajus algorithm)によって強連結成分(SCC)を求め、成分が1つだけなら強連結、2つ以上に分かれるなら弱連結と判断します。以下に、そのC++プログラムを紹介します。使用する関数本プログラムでは、次の2つの

  5. 循環グラフの彩色指数(クロマティックインデックス)を求めるC++プログラム

    彩色指数(クロマティックインデックス)とは、与えられたグラフの辺彩色に必要な色数の最大値のことです。本記事では、循環グラフの彩色指数を求めるC++プログラムを紹介します。アルゴリズムこのプログラムの処理の流れは以下のとおりです。開始 頂点数「n」と辺数「e」を入力として受け取る。 グラフの「e」個の辺について、頂点ペアをedge[][]に入力する。 関数ChromaticIndex()でグラフの辺を彩色する: A) 現在の辺に色cを割り当てる。 B) 隣接する辺の中に同じ色が存在する場合、その色を破棄し、 flagラベルに戻って次の色で再試

  6. グラフの関節点(アーティキュレーションポイント)を検出するC++プログラム

    グラフにおける関節点(Articulation Point、カット頂点とも呼ばれます)とは、その頂点(およびそれに接続する辺)を取り除くとグラフが分断されてしまう頂点のことです。非連結な無向グラフの場合は、その頂点を削除すると連結成分の数が増加する頂点が関節点に該当します。アルゴリズム関節点の検出にはDFS(深さ優先探索)を使用します。DFSにおいて、頂点 w が次のいずれかの条件を満たす場合、w は関節点となります。w が DFS ツリーのルートであり、少なくとも2つの子を持つ場合w が DFS ツリーのルートではなく、w を根とする部分木内のどの頂点からも、w の祖先への後退辺(バックエッ

  7. C++でグラフ内の2つのノード間の経路を探索するプログラム

    本記事では、C++を使って、与えられたグラフ上であるノード(頂点)から別のノードへ到達可能かどうかを判定するプログラムを紹介します。グラフの探索には、キューを用いた幅優先探索(BFS)を活用します。 アルゴリズムの流れ 始点 s から終点 d への到達可能性を判定する関数 isReach() は、以下の手順で動作します。 すべての頂点を「未訪問」として初期化します。 現在のノード(始点)を訪問済みとしてマークし、キューに追加します。このキューは、各頂点の隣接頂点を順に処理するために使用されます。 キューから頂点を取り出し(デキュー)、その隣接頂点をすべて取得します。 隣接頂点がまだ訪問されて

  8. DAG(有向非巡回グラフ)におけるSSSP(単一始点最短経路)を求めるC++プログラム

    本記事では、ダイクストラ法を用いて有向非巡回グラフ(DAG:Directed Acyclic Graph)における単一始点最短経路(SSSP:Single Source Shortest Path)を求めるC++プログラムを紹介します。このプログラムは、グラフの始点となる最初のノードから他のすべてのノードへの最短経路長を計算し、各頂点に対してそのコストを出力します。 アルゴリズム まず、グラフの重みを隣接行列として入力し、その後ダイクストラ法の手法に従って最短経路を求めていきます。処理で使われる主な変数は次のとおりです。 a[i]:ノード i が確定済みかどうかを示すフラグ(1=確定済み)

  9. C++でグラフの橋(エッジ接続)を検出するプログラムの解説

    本記事では、グラフ理論における重要な概念である「橋(ブリッジ)」、すなわちグラフのエッジ接続(Edge Connectivity)をC++で検出する方法を解説します。 橋(ブリッジ)とは? グラフにおける「橋」とは、その辺を取り除くとグラフが非連結(切断された状態)になってしまうような辺のことです。無向グラフから橋を削除すると、連結成分の数が増加します。つまり、橋はグラフ全体の連結性を保つ上で重要な役割を持つ辺だと言えます。 この問題は、DFS(深さ優先探索)を利用したTarjanのアルゴリズムの考え方を使うことで効率的に解くことができます。各頂点に対して「発見時刻(disc)」と「到達可能な

  10. 【C++】辞書式順序で集合のすべての部分集合を生成するプログラム

    本記事では、与えられた集合(配列)のすべての部分集合を辞書式順序(lexicographic order)で生成して出力するC++プログラムを紹介します。このアルゴリズムは、配列として与えられた集合から、要素数ごとの可能な組み合わせをすべて昇順に出力します。時間計算量は O(n×2n) です。 アルゴリズムの流れ Begin 各長さ「i」について GenAllSubset() 関数を呼び出します。 1) GenAllSubset() の中で、currLen が reqLen より大きい場合はそのまま戻ります。 2) そうでなければ、currLen が reqLen と等

  11. C++でグラフの頂点被覆を求めるヒューリスティックを実装する方法

    頂点被覆(Vertex Cover)とは?グラフの頂点被覆(Vertex Cover)とは、グラフ内のすべての辺について、その辺が結ぶ2つの頂点MとNのうち、少なくとも一方(または両方)が集合Vに含まれるような頂点集合Vのことです。頂点被覆を求める問題はNP困難として知られており、大規模なグラフに対して厳密な最適解を多項式時間で求めることは一般的に困難です。そこで本記事では、近似解を高速に得られる貪欲法ベースのヒューリスティックをC++で実装します。アルゴリズムの手順このヒューリスティックは、「辺を1つ選び、その両端の頂点を解に加え、それらに関連する辺を取り除く」という操作を繰り返すシンプルな

  12. C++で実装するグラフの辺彩色(エッジカラーリング)プログラム

    この記事では、グラフの辺彩色(エッジカラーリング)を行うC++プログラムを紹介します。辺彩色とは、グラフのすべての辺に色を割り当てる際に、同じ頂点に接続する(隣接する)2つの辺が同じ色にならないようにする問題です。 アルゴリズムの全体像 本プログラムでは、キューを用いた幅優先探索(BFS)によって頂点を順に訪問しながら、各辺に適切な色を割り当てていきます。大まかな流れは次のとおりです。 Begin 1. グラフの頂点数 n と辺数 e を入力として受け取る。 2. グラフを隣接リストとして格納する。 3. キューを使ったBFSを実装し、各辺に色を割り当てる。 End

  13. C++で完全グラフの辺彩色(エッジカラーリング)を実行するプログラム

    完全グラフと辺彩色(エッジカラーリング)とは 完全グラフとは、グラフ内の任意の2つの頂点どうしが必ず1本の辺で結ばれているグラフのことです。頂点数が n の完全グラフにおける辺の総数は、e = n × (n − 1) / 2 となります。 辺彩色(エッジカラーリング)とは、同じ頂点を共有する隣接した辺同士が同じ色にならないように、グラフのすべての辺へ色を割り当てる問題です。本記事では、完全グラフに対して辺彩色を実行するC++プログラムを紹介します。 アルゴリズム 頂点数「n」を入力として受け取ります。 e = n × (n − 1) / 2 本の辺を用いて、完全グラフを配列 ed[][] 上

  14. C++でshort型のリテラルを書く方法を解説

    この記事では、C++におけるshort型のリテラルの書き方について解説します。C言語やC++では、データ型ごとに異なるリテラル(サフィックス)が用意されています。主なデータ型とリテラルの対応は以下の通りです。番号データ型とリテラルの例1int52unsigned int5U3long5L4long long5LL5float5.0f6double5.07char\5上記の表を見ると、int、long、float、doubleなどにはリテラル(サフィックス)が存在しますが、short型専用のリテラルは用意されていません。そのため、short型のデータに対して直接リテラルを指定することはできません

  15. C/C++におけるenum・const・#defineの違いを徹底解説

    CやC++で定数を定義する方法には、主に「#define」「const(static const)」「enum」の3つがあります。どれも定数を扱うための機能ですが、仕組みや動作が異なるため、初心者の方は使い分けに迷うことも多いでしょう。本記事では、それぞれの特徴と違いを具体例とともにわかりやすく解説します。 #defineとは #defineはプリプロセッサによって処理されるマクロです。コンパイル前にテキスト的な置換が行われるため、型の情報は一切持ちません。そのため、意図しないバグにつながる可能性があります。 #include <iostream> using namespace

  16. C言語のマクロとプリプロセッサを徹底解説!主要ディレクティブと定義済みマクロの使い方

    Cプリプロセッサ(CPP)は、コンパイラの一部ではなく、コンパイル処理における独立したステップとして動作します。簡単に言えば、Cプリプロセッサはテキストの置換を行うツールであり、実際のコンパイルが始まる前に必要な前処理をコンパイラに指示する役割を担っています。 プリプロセッサディレクティブの基本ルール すべてのプリプロセッサコマンドはハッシュ記号(#)で始まります。この記号は空白以外の最初の文字でなければならず、可読性の観点から、プリプロセッサディレクティブは行の先頭(第1カラム)から記述することが推奨されます。 以下に、重要なプリプロセッサディレクティブを一覧でまとめました。 番号ディレ

  17. C++で構造体をソートする方法:メンバ変数を条件に並べ替えるテクニック

    C++では、独自に定義した構造体(struct)でも、適切な比較関数を用意することで簡単に並べ替えができます。この記事では、書籍情報を格納する「book」構造体を例に、タイトル・ページ数・価格という複数のメンバ変数を持つ構造体を、価格(price)を基準に昇順ソートする方法を解説します。 構造体のソートの基本考え方 構造体はintやdoubleのような単純な型ではないため、そのまま比較することはできません。そこで、「2つの構造体をどのように比較するか」を判定する比較関数を自分で定義する必要があります。 この比較関数は、標準ライブラリのstd::sort()関数の第3引数として渡すことで、指定

  18. C/C++の型キャストとは?基礎から整数昇格・通常の算術型変換まで解説

    型キャスト(型変換)とは、あるデータ型の変数を別のデータ型へ変換する手法のことです。例えば、long型の値を単純なint型の変数に格納したい場合、longをintへキャストすることができます。値をある型から別の型へ明示的に変換するには、キャスト演算子を次の形式で使用します。(型名) 式キャスト演算子の使用例次の例では、キャスト演算子によって整数変数同士の除算が浮動小数点演算として実行されます。#include <stdio.h> main() { int sum = 17, count = 5; double mean; mean = (double) su

  19. C/C++におけるdo-whileループとwhileループの違いを徹底解説

    本記事では、C言語およびC++におけるdo-whileループとwhileループの基本的な違いについて、コード例を交えながら詳しく解説します。 whileループとは C言語におけるwhileループは、指定された条件が真(true)である限り、対象のステートメントを繰り返し実行する制御構造です。基本構文は以下の通りです。 while(condition) { statement(s); } ここで、statement(s)は単一のステートメントでも複数のステートメントからなるブロックでも構いません。conditionには任意の式を指定でき、0以外の値はすべて「真」とみなされます。ループは条

  20. 64ビット版GCCでC/C++の32ビットプログラムをコンパイルする方法

    近年のGCCコンパイラは、デフォルトで64ビット版として提供されています。しかし、開発の現場では32ビット環境向けにコードをコンパイル・実行する必要が生じることがあります。そんなときに役立つのが、GCCの-m32オプションです。この記事では、64ビット版GCCを使って32ビットプログラムをコンパイルする手順と、発生しうるエラーへの対処法を解説します。1. 現在のGCCのターゲット環境を確認するまず、使用しているGCCがどのアーキテクチャ向けにビルドされているかを確認しましょう。以下のコマンドを実行します。gcc –v Using built-in specs. COLLECT_GCC=gcc

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:49/300  20-コンピューター/Page Goto:1 43 44 45 46 47 48 49 50 51 52 53 54 55