タグ付けされた質問 「graphs」

グラフ、エッジで接続されたノードの離散構造に関する質問。人気のフレーバーは、エッジキャパシティを持つツリーとネットワークです。

1
グラフにエッジを追加すると、最短距離はいくつ変化しますか?
してみましょう、いくつかの完全な、加重、無向グラフとします。からエッジを1つずつ追加して、2番目のグラフを作成します。合計でエッジをに追加します。G ′ = (V 、E ′)E E ′ Θ (| V |)G ′G=(V,E)G=(V,E)G=(V,E)G′=(V,E′)G′=(V,E′)G'=(V, E')EEEE′E′E'Θ(|V|)Θ(|V|)\Theta(|V|)G′G′G' 我々は一つのエッジを追加するたびにに、我々はすべてのペア間の最短距離を考える及び。を追加した結果、これらの最短距離がいくつ変化したかを数えます。してみましょう最短距離の数も変化することを、私たちは追加したときに番目のエッジを、とlet、我々は、合計で追加エッジの数をすること。E ′(V 、E ′)(V 、E ′ ∪ { (u 、v )} )(u 、v )C i i n(u,v)(u,v)(u,v)E′E′E'(V,E′)(V,E′)(V, E')(V,E′∪{(u,v)})(V,E′∪{(u,v)})(V, E' \cup \{ (u,v) \})(u,v)(u,v)(u,v)CiCiC_iiiinnn 大きさは?C=∑iCinC=∑iCinC = \frac{\sum_i C_i}{n} 、も同様。この限界は改善できますか?は追加されたすべてのエッジの平均であると定義しているため、であることが証明されていますが、多くの距離が変化する単一のラウンドはそれほど興味深いものではありません。C = O (n 2)C C = Ω (n …

2
ダイクストラのアルゴリズムは、優先キューを持つBFSだけですか?
この質問は、コンピューターサイエンススタック交換で回答できるため、理論的コンピューターサイエンススタック交換から移行されました。 6年前に移行され ました。 このページによると、ダイクストラのアルゴリズムは優先キューを備えたBFSにすぎません。本当にそんなに簡単なのですか?私はそうは思いません。

2
ベルマンフォードを使用して負のサイクルを取得
有向グラフで負のサイクルを見つけなければなりません。ベルマンフォードアルゴリズムの仕組みと、到達可能な負のサイクルがあるかどうかがわかります。ただし、明示的に名前を付けるわけではありません。 サイクルの実際のパスを取得するにはどうすればよいですか?v 1 、v 2 、… v k 、v 1v1,v2,…vk,v1v1, v2, \ldots vk, v1 標準アルゴリズムを適用した後、すでに回の反復を行っているため、それ以上の改善は不可能です。それでもノードまでの距離を短くできる場合は、負のサイクルが存在します。n − 1n−1n-1 私のアイデアは次のとおりです。パスを改善できるエッジと各ノードの先行ノードを知っているので、再びエッジに到達するまでそのエッジからさかのぼることができます。これでサイクルができました。 悲しいことに、これが正しいかどうかを伝える論文は見つかりませんでした。それで、実際にそのように機能しますか? 編集:この例は、私の考えが間違っていることを証明しています。次のグラフを考えると、ノードからBellman-Fordを実行します。111 エッジを順に処理します。回の反復の後、ノード距離を取得します:n − 1a 、b 、c 、da,b,c,da, b, c, dn − 1n−1n-1 2 :− 30 3 :− 151 :− 51:−51: -5 2 :− 302:−302: -30 3 :− 153:−153: -15 そして親テーブル:親持ち親持ち親を持っている 3 …

2
有向グラフで同じ長さの少なくとも2つのパスを見つける
有向グラフと2つのノードおよびBがあるとします。次の決定問題を計算するためのアルゴリズムが既にあるかどうかを知りたい:A BG = (V、E)G=(V,E)G=(V,E)AAABBB 同じ長さのAAAとBBBの間に少なくとも2つのパスがありますか? 複雑さはどうですか?多項式時間で解決できますか? グラフに新しい制約を追加したいのですが、おそらく問題はより解決可能です。隣接行列では、すべての列が空ではありません。したがって、すべてのノードには入力に少なくとも1つの矢印があり、少なくとも1つのノードが自身に接続されています。そのため、ノードが私ii番目のノードである場合、(i 、i )(i,i)(i,i)はグラフのエッジです。

2
最大フロー計算または他のアプリケーションのために、実際にリンクカットツリーは使用されていますか?
私がよく実装する多くの最大フローアルゴリズム、ダイニックのアルゴリズム、プッシュ再ラベルなどでは、動的ツリー(リンクカットツリーとも呼ばれます)を使用することで漸近的な時間コストを改善できます。 プッシュ再ラベルは、通常またはまたはますが、動的ツリーO (V 3)O (V 2 √O (V2E)O(V2E)O(V^2E)O (V3)O(V3)O(V^3)O(VElog(V2/E))O (V2E−−√)O(V2E)O(V^2\sqrt{E})O (VEログ(V2/ E))O(VElog⁡(V2/E))O(VE \log(V^2/E)) Dinicのアルゴリズムはで実行されますが、動的ツリーO (V E log (V ))O (V2E)O(V2E)O(V^2E)O (VEログ(V))O(VElog⁡(V))O(VE\log(V)) ただし、ほとんどのライブラリでのmax-flowアルゴリズムの実用的な実装では、このデータ構造を使用していないようです。ダイナミックツリーは、実際には最大フロー計算に使用されていますか?または、実際の問題のサイズに役立つにはオーバーヘッドが大きすぎますか? リンクカットツリーが使用される他の問題ドメインはありますか? この質問は、cstheoryで私が尋ねた質問に関連しています。最先端のMaximum Flowアルゴリズムは実用的ですか?

1
ランダムテストグラフアルゴリズムの入力を生成しますか?
アルゴリズムをテストする場合、一般的なアプローチはランダムテストです。ある分布(通常は均一)に従ってかなりの数の入力を生成し、それらに対してアルゴリズムを実行して、正当性を検証します。最新のテストフレームワークでは、いくつかの制限がありますが、アルゴリズムシグネチャを指定して自動的に入力を生成できます。 入力が数字、リスト、または文字列の場合、そのような入力を簡単に生成します。ツリーはより難しくなりますが、それでも簡単です(確率的な文脈自由文法または同様のアプローチを使用)。 ランダムグラフを(効率的に)生成するにはどうすればよいですか?通常、グラフをランダムに均一に選択することは、望むものではありません。それらは接続されているか、平面であるか、サイクルフリーであるか、他のプロパティを満たしている必要があります。拒否サンプリングは、潜在的に膨大な望ましくないグラフのセットのため、次善のようです。 注目すべき有用な分布は何ですか?ここで有用なのは グラフは手元のアルゴリズムを十分にテストする可能性が高く、 効果的かつ効率的に生成できます。 ランダムグラフには多くのモデルがあることを知っているので、この点でグラフ生成に最適な洞察に感謝します。 「あるアルゴリズム」が一般的すぎる場合は、テスト中のアルゴリズムの具体的なクラスとして、最短パス検索アルゴリズムを使用してください。テスト用のグラフは、接続されており、かなり高密度である必要があります(高い確率で、または少なくとも予想)。テストの場合、最適な解決策は、最短のパスの周りにランダムなグラフを作成して、目的の結果を知ることです(別のアルゴリズムを使用する必要はありません)。

2
無向グラフ上の最短経路?
だから私はこの(多少基本的な)質問はここに属していると思った: サイズが100のノードのグラフが10x10のパターンで配列されているとします(チェス盤を考えてください)。グラフは無向であり、重み付けされていません。グラフを移動するには、3つのスペースを前方に移動し、1つのスペースを右または左に移動します(チェスナイトがボード上を移動するのと同様)。 開始ノードが固定されている場合、ボード上の他のノードへの最短パスをどのように見つけますか? 実行可能な移動であるノード間にのみエッジがあると想像しました。したがって、この情報が与えられたら、開始ノードから終了ノードまでの最短パスを見つけたいと思います。 私の最初の考えは、各エッジは重み1で重み付けされるということでした。しかし、グラフは無向であるため、ジクストラは理想的なフィットではありません。したがって、私は深さ優先検索の変更された形式を使用してそれを行うことにしました。 しかし、検索を使用して最短経路を取得する方法を視覚化することはできませんでした。 私が試したもう1つのことは、開始ノードをルートとしてツリー形式でグラフを配置し、次に希望の終了ノードを与えた最も浅い(最も低い行番号)結果を選択することでした...これはうまくいきましたが、非常に効率的ではなかったため、大きなグラフでは機能しません。 誰かが私にこの方向性を正しい方向に向けるようなアイデアを持っていますか? どうもありがとうございました。 (グラフの視覚化を試みましたが、評判が悪いためできませんでした)

2
ユニパシーグラフはいくつのエッジを持つことができますか?
ユニパシーグラフは、1つの頂点から他の頂点への単純なパスが最大1つであるような有向グラフです。 ユニパシーグラフにはサイクルがあります。たとえば、二重にリンクされたリスト(円形のリストではありません!)は単一パスのグラフです。リストに要素がある場合、グラフには長さ2のサイクル、合計ます。nnnn−1n−1n-12(n−1)2(n−1)2(n-1) 個の頂点を持つユニパシーグラフのエッジの最大数はいくつですか?漸近的な境界があります(例:または)。O (n )Θ (n 2)nnnO(n)O(n)O(n)Θ(n2)Θ(n2)\Theta(n^2) 計量された単一経路グラフで最短経路を見つけることに触発されました。で、私の証明、私は当初、エッジの数があったと主張したかったが、その後のサイクル数を境界とすることは十分であったことに気づきました。O(n)O(n)O(n)

4
有向グラフが重要なのはなぜですか?
この投稿を改善したいですか?引用や回答が正しい理由の説明など、この質問に対する詳細な回答を提供します。十分な詳細のない回答は、編集または削除できます。 有向グラフのMST、強い接続性、ルーティングなどのアルゴリズムについて読んでいます。 また最近では、有向グラフの動的でフォールトトレラントなアルゴリズムの研究が行われています。 しかし、下線グラフネットワークが「指示」される実用的なアプリケーションがあるかどうか疑問に思っていました。ソーシャルネットワーク以外に、鉄道/道路網、インターネットネットワークなど、考えられるすべての問題は、無向グラフのみを処理します。 編集1:これらはリンクが向けられているいくつかのシナリオをモデル化するために使用できることを理解していますが、これらのシナリオが実際にどのくらいの頻度で発生するのか、そして有向グラフのフォールトトレランスの研究はどれほど重要であるのか疑問に思っていました。

4
グラフの深さ優先検索におけるグレーノードの目的
私が見た深さ優先検索の多くの実装(例:ここ)では、コードは灰色の頂点(発見されたが、そのすべての隣人が訪問されたわけではない)と黒の頂点(発見され、そのすべての隣人が訪問された)を区別します。この区別の目的は何ですか?DFSアルゴリズムは、グレーであるか黒であるかに関係なく、訪問先の頂点にアクセスすることはないようです。

2
AO *アルゴリズムを実装する方法は?
検索アルゴリズムを実装するときに、異なるデータ構造が使用されることに気付きました。たとえば、キュ​​ーを使用して幅優先検索を実装し、スタックを使用して深さ優先検索を実装し、最小ヒープを使用してA *アルゴリズムを実装します。これらの場合、検索ツリーを明示的に構築する必要はありません。 しかし、AO *アルゴリズムの検索プロセスをシミュレートする単純なデータ構造を見つけることはできません。検索ツリーを明示的に構築することがAO *アルゴリズムを実装する唯一の方法であるかどうかを知りたいですか?誰でも私に効率的な実装を提供できますか?

2
最小カットから最大フローを計算する
最大フローの応答を計算することを知っています。容量のあるネットワークの最小カットは同等です。cf. 最大フロー最小カット定理。 最大フローを計算するためのアルゴリズム(多少効率的)があり、最大フローが与えられた場合の最小カットの計算も難しくも高価でもありません。 しかし、その逆はどうですか?最小カットが与えられた場合、最大フローをどのように決定できますか?もちろん、ゼロからMax-Flowを解決することなく、できればそれよりも高速です。 いくつかの考え: 最小カットから、最大流量値がわかります。この情報が標準パスのAugmenting-PathおよびPush-Relabelのアプローチにどのように役立つかはわかりませんが、後者の適応はやや理にかなっています。 最小カットを使用してネットワークを2つの部分に分割して再帰することはできません(最悪の場合(1つのパーティションがシングルトンの場合)、問題を縮小しないためです)。また、小さなインスタンスの最小カットもありません。 最大フロー速度の値を知っていると、おそらく補完的なスラックネス条件によって、Max-Flow LPを解くことができますか?

4
巨大なグラフでのダイクストラのアルゴリズム
私はダイクストラに非常に精通しており、アルゴリズムについて具体的な質問があります。35億ノード(すべてOpenStreetMapデータ)などの巨大なグラフがある場合、グラフをメモリに格納できないことは明らかなので、グラフはデータベースのディスクに保存されます。 そのようなグラフの最短経路を計算するために利用可能なライブラリがあります。彼らはどうやってこれをしますか?より具体的には、ダイクストラのアルゴリズムを実行するためにグラフの必要な部分をどのようにロードしますか? 訪問した各頂点の隣接リストを取得するには、統計データによると10,000ノードあたり約1,500のデータベースクエリが必要になるため、明らかにそうではありません。それはとても遅すぎるでしょう。 どうやってやっているの?自分で実装しようとしています。

3
DAGを新しいDAGに縮小する最小サイズ
DAGがあります。ノード関数がありますF:V→NF:V→NF\colon V\to \mathbb N(大まかに言うと、ノードに番号を付けます)。これらのルールを使用して、新しい有向グラフを作成します。 F(x)≠F(y)⇒x′≠y′F(x)≠F(y)⇒x′≠y′F(x) \neq F(y) \Rightarrow x' \neq y'x′≠y′⇏F(x)≠F(y)x′≠y′⇏F(x)≠F(y)x' \neq y'\nRightarrow F(x) \neq F(y) :私たちは、新しいノード間のすべての古いエッジ追加。(x,y)∈E∧x′≠y′⟺(x′,y′)∈E′(x,y)∈E∧x′≠y′⟺(x′,y′)∈E′(x,y) \in E \land x' \neq y' \iff (x',y')\in E' この新しいグラフはまだDAGです。 最小値は何ですか?最小限の新しいグラフを作成するアルゴリズムとは何ですか?|V′||V′||V'|

4
グラフには2つまたは3つの異なる最小全域木がありますか?
特定のグラフGに2つの異なる最小全域木があるかどうかを検出する効率的な方法を見つけようとしています。また、3つの異なる最小スパニングツリーがあるかどうかを確認する方法を探しています。私が考えた素朴な解決策は、クラスカルのアルゴリズムを一度実行して、最小スパニングツリーの総重量を見つけることです。後で、グラフからエッジを削除してクラスカルのアルゴリズムを再度実行し、新しいツリーの重みが元の最小スパニングツリーの重みであるかどうかをチェックします。グラフの各エッジについても同様です。ランタイムはO(| V || E | log | V |)であり、これはまったく良くありません。もっと良い方法があると思います。 どんな提案でも役立つでしょう、事前に感謝します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.