2012-03-14 9 views
2

私はComputerと呼ばれるオブジェクトクラスを持っているとします。次に、Wireという別のクラスがあるとします。 (これらの名前は単に私がやろうとしているかを説明するのに使用されている、本物はもう少し複雑です)複数のオブジェクトのネットワーキングの問題

struct Computer { 
std::vector<Wire *> wires; 
}; 

struct Wire { 
Computer * computers[2]; 
}; 

だから私はコンピュータのクラスを持ち、すべてのコンピュータに何かをしたいのは、今言わせてワイヤを介して接続されています。私は、ループは、すべてのワイヤを介して可能性があり、コンピュータが行うので、ワイヤに方法があります:

wire->doSomething(this,blahblah) 

ので、ワイヤは、他のコンピュータを見つけ、ワイヤのリストを通過し、同じことを行います。

otherWire->doSomething(&otherComputer,blahblah) 

(もちろん、リスト内で見つかるとスキップします)

これは機能しますが、循環リンクがある場合、すべてのボールに連続してdoSomethingを呼び出して無限ループを作成します。これを防ぐための最善の方法は何ですか、あるいはこの問題の全体的な解決法がありますか?

+2

*脇には*:実世界のネットワークは、[同じ問題](http://en.wikipedia.org/wiki/Bridge_loop)を持っています彼らは(それは異なって解決するが)(http://en.wikipedia.org/wiki/Spanning_tree_protocol)。 –

答えて

2

あなたが持っているのは、の循環グラフです。

通常、各ノードに「訪問済み」プロパティを使用し、各ノードにアクセスする前にまだ訪問していないことを確認します。あなたがしたい半擬似コードで

std::map<Wire*,bool> visited; // Outside the search, so that it's not local 

if (!visited[otherWire]) { 
    visited[otherWire] = true; 
    otherWire->doSomething(&otherComputer,blahblah) 
} 
+0

私は参照してください。しかし、すべてのワイヤ操作の後に訪問変数をクリアする必要がありますか? – slartibartfast

+0

@myrkos検索ごとに訪問先ノードのリストを1つ作成したいとします。 (グローバルで、リセットした場合は、再入可能ではないかもしれませんが、問題はないかもしれません)。リセットと同時検索は1つだけ可能ですが、可能な解決策です。もう1つは、検索中、「訪問済み」地図への参照を渡すことです。 – Flexo

+0

@myrkos - これは一般的なケースでは機能しません。グラフの中で、開始したノードで始まらないサイクルがあるとします。サイクルがあなたの特定の問題から始まる唯一の方法は、そうであることが分かっているなら、それはOKですが、それは一般化しません。 – Flexo

関連する問題