2016-08-07 5 views
1

グラフの1サイクルでノード数を調べようとしています。私はグラフのすべてのサイクルでノードの数を計算するために再帰とDFSを使用しています。ここではC++の計算関数です。グラフのサイクル中のノード数

int iscyclic(int node,bool visited[],bool rec[],vector<int>g[]) 
{ 
    if(!visited[node]) 
{ 
    visited[node] = true; 
    rec[node] = true; 
    vector<int>::iterator it; 
    for(it=g[node].begin();it!=g[node].end();it++) 
    { 
     if(!visited[*it] && iscyclic(*it,visited,rec,g)) 
     { 
      kount++; 
     } 
     else if(rec[*it]) 
      kount++; 
    } 
} 
rec[node] = false; 
return kount; 
} 

Visitedrec配列は、デフォルトではfalseに設定されているとkountは、グローバル0として設定されています。 kountは、有向グラフのサイクル内のノード数を計算することになっています。答えが間違っているケースがあります。助けてください。私は最近グラフ理論を学び始めました。

+1

"答えが間違っている場合があります。" - 例?エッジ= 4 のノードの –

+0

数= 4 番号と次のように接続がある: - 1 -2、 2 -3、 3 -4、 4 -3、 –

+0

サイクル数は指数関数的ですグラフのサイズで、それらをすべて計算していると確信していますか? –

答えて

0

あなたはこれを行うべきではありません。

else if(rec[*it]) 
    kount++; 

はまた、あなたが開始ノード(あなたが持つ関数を呼び出す1)は本当にサイクルの一部であることを確認する必要があります。

第3の事柄 - このブランチでサイクルが発生したかどうかに基づいて、実際にtrueまたはfalseを返す必要がある場合は、関数の結果としてkcountを返します。

+0

ブール値を返すと、サイクルが存在するかどうかの結果が得られますが、そのサイクルに存在するノードの数 –

+0

いいえ。あなたは 'kcount'で結果を取得します。それはグローバルで、いつでもアクセスできます。一方、サイクルを見つけたかどうかは、現在処理されている再帰分岐が成功したかどうかを示す重要な結果です。成功した場合は、他の支店 –

関連する問題