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

有向グラフがツリーであるか、DFSを使用していないかを確認するC++プログラム


グラフにサイクルが含まれていない場合、グラフはツリーです。これは、有向グラフがツリーであるかどうかをDFSを使用してチェックするC++プログラムです。

アルゴリズム

 Beginfunction CyclicUtil():a)現在のノードを訪問済みとして再帰スタックの一部としてマークします。b)この頂点に隣接するすべての頂点に対して再帰します。 c)再帰スタックから頂点を削除します。functioncyclic():a)すべての頂点を訪問されておらず、再帰スタックの一部ではないものとしてマークします。b)CyclicUtill()関数を呼び出して、さまざまなツリーのサイクルを検出します。 

 #include  #include  #include  using namespace std; class G {int n; list  * adj; //隣接リストを含みます。 bool CyclicUtil(int v、boolvisited []、bool * rs); public:G(int V); //コンストラクタvoidaddEd(int v、int w); bool Cyclic();}; G ::G(int n){this-> n =n; adj =new list  [n];} void G ::addEd(int v、int u)//グラフにエッジを追加する{adj [v] .push_back(u); //uをvのリストに追加}boolG ::CyclicUtil(int v、bool visited []、bool * recurS){if(visited [v] ==false){visited [v] =true; //現在のノードを訪問済みとしてマークし、再帰スタックの一部recurS [v] =true; //この頂点に隣接するすべての頂点に対して繰り返します。 list  ::iterator i; for(i =adj [v] .begin(); i!=adj [v] .end(); ++ i){if(!visited [* i] &&CyclicUtil(* i、visited、recurS))return true; else if(recurS [* i])return true; }} recurS [v] =false; //再帰スタックから頂点を削除します。 returnfalse;}//グラフがツリーであるかnotboolであるかを確認しますG::cyclic(){//すべての頂点を訪問されておらず、再帰スタックの一部ではないものとしてマークしますbool * visited =new bool [n]; bool * recurS =new bool [n]; for(int i =0; i  

出力

有向グラフはツリーではありません

  1. グラフが強く接続されているかどうかをチェックするC++プログラム

    有向グラフでは、1つのコンポーネントの頂点の各ペアの間にパスがある場合、コンポーネントは強く接続されていると言われます。 このアルゴリズムを解決するには、まず、DFSアルゴリズムを使用して各頂点の終了時間を取得し、次に転置されたグラフの終了時間を検索します。次に、頂点をトポロジカルソートの降順で並べ替えます。 入力 :グラフの隣接行列。 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 出力 :以下は、与え

  2. DFSを使用して有向グラフの接続性をチェックするC++プログラム

    グラフの接続性を確認するために、トラバーサルアルゴリズムを使用してすべてのノードをトラバースしようとします。トラバーサルの完了後、アクセスされていないノードがある場合、グラフは接続されていません。 有向グラフの場合、接続を確認するためにすべてのノードからトラバースを開始します。 1つのエッジに外向きのエッジのみがあり、内向きのエッジがない場合があるため、他の開始ノードからノードにアクセスできなくなります。 この場合、トラバーサルアルゴリズムは再帰的なDFSトラバーサルです。 入力 :グラフの隣接行列 0 1 0 0 0 0 0 1 0