8

N 個のノード (0 から N-1 までの番号) と正確に (N-1) 個の双方向 Edgesを持つグラフ G(V,E) が与えられます。

グラフの各エッジには正のコスト C(u,v) (エッジの重み) があります。

グラフ全体は、ノードの任意のペア間に一意のパスがあるようなものです。

また、爆弾が配置されるノード番号のリストLも与えられます。

私たちの目的は、グラフからエッジを損傷/除去した後、爆弾間の接続がなくなるように、グラフからエッジを損傷/除去することです --

つまり、ダメージを与えた後、2 つの爆弾の間にパスがありません

Edge(u,v) = Edge weight(u,v)を損傷するコスト

したがって、ダメージの総コストが最小になるように、これらのエッジにダメージを与える必要があります

例:

Total Nodes=N=5 
Total Bomb=Size of List L=3

List L={2,4,0}//Thats is at node number 2,4 and 0 bomb is placed...

Total Edges =N-1=4 edges are::

u v Edge-Weight

2 1 8

1 0 5

2 4 5

1 3 4



In this case the answer is ::
Total Damaging cost =(Edge Weight (2,4) + Edge Weight(0,1))
           =5+5=10.

So when we remove the edge connecting node (2,4),
and the edge connecting node (0,1) ,there is no connection left 
between any pair of machines in List {2,4,0};

Note any other,combinations of edges(that  we damaged ) to achieve the
target goal ,needs more than 10 unit cost.  

ここに画像の説明を入力

Constraints::
N(ie. Number of Nodes) <= 100,000
ListSize |L|(ie. Number of Bombs) <= N
1 <=Edge cost(u,v) <= 1000,000

私は何をしたのですか?

今まで、効率的な方法を見つけられませんでした:( .

さらに、ノードの数がNであるため、エッジの数は正確であり、グラフ全体はノードの任意のペア間に一意のパスがあるようなものであり、グラフはTREEN-1であるという結論を得ました。

Kruskal アルゴリズムを変更しようとしましたが、それも役に立ちませんでした。

ありがとう!

4

6 に答える 6

4

修正されたクルスカルがここに行く方法だと思います.

グラフ G'=(V', E'), V'=V, E'={} を取ります。E のエッジをコストの増加しない順に並べ替えます。ここで、E の各エッジについて、爆弾を含む頂点を持つ 2 つのコンポーネントを接続しない場合は、それを E' に追加します。結果は、EE' のコストの合計です。

編集:

あなたの例でこれを実行します。

最初は、エッジのセットは空です {}。増加しない順序でソートされたエッジを取得します [(1, 2), (0, 1), (2, 4), (1, 3)]

したがって、最初は、グラフは 5 つの切断されたコンポーネントで構成されています。

(1, 2) のコストは 8 で、接続するコンポーネントの 1 つだけに爆弾があります。したがって、これを E' に追加します。E'={(1, 2)} で、4 つの成分があります。

次に高いコスト エッジは (0, 1) で、コストは 5 です。ただし、両方のコンポーネントに爆弾があるため、このエッジを追加しないでください。

次は (2, 4) です。これも爆弾のあるコンポーネントに接続するので、これもスキップします。

最後に、最低コスト エッジは (1, 3) です。そのコンポーネントの 1 つ (ノード 3 のみを含む) には爆弾がないため、それを E' に追加します。

これにより、E' = {(1,2), (1, 3)} が得られます。

私の推論は、コストの低いエッジの前にコストの高いエッジを追加しようとすることです。これにより、元のノードに爆弾があるノード間のすべてのパスで、最低コスト以外のすべてが追加されます。

于 2012-06-19T09:20:01.230 に答える
2

これは線形時間で実行できると思います。

いくつかの頂点でツリーをルート化してから、ボトムアップのトラバーサルから始めます。

いくつかの葉から始めます。爆弾がない場合は、葉を切り落として移動します。爆弾がある場合は、この葉への道の 1 つのエッジをカットする必要があります。最安エッジに関する情報をこのリーフアップに伝播します。

次に、内側の頂点にいるときは、次の可能性があります。頂点に爆弾があり、その下にいくつかの爆弾がある場合、それらすべてへの最も安価なパスをカットします。爆弾がなく、下に爆弾が 1 つしかない場合は、最も安価なパスに関する情報を伝達します。下にさらに爆弾がある場合は、最も高価なパスを持つ 1 つを除いてすべてをカットします。

于 2012-06-19T09:48:19.093 に答える
2

これは、ツリーのマルチウェイ カット問題です。これは、単純な動的計画法によって多項式時間で解くことができます。Chopra と Rao: " On the multiway cut polyhedron ", Networks 21(1):51–89, 1991 を参照してください。

于 2012-06-19T10:40:48.837 に答える
1

これが私の仮説です:

グラフGはツリーです。したがって、任意の 2 つのノード間には1 つのパスしかありません。

L赤 (爆弾) ノードとVL白 (非爆弾ノード)があるとします。この解には、G を L 個のサブツリーのフォレストに分割する必要があります。これには、最低でもL-1エッジを削除する必要があります。

削除された各エッジは、2 つの Red ノード間のパス上にある必要があります。

A. ツリー G を剪定して、2 つの赤いノード間のパスに参加しないすべてのエッジを削除します。

  1. ホワイト リーフ ノード (およびインシデント エッジ) を考慮から外します。
  2. 変更されたグラフにホワイト リーフ ノードがなくなるまで #1 を繰り返します。

B. (A) の後、グラフに残っているすべてのエッジは、2 つの赤いノード間のパスを形成するエッジです。

このツリーで重みが最小のエッジを選択します。これにより、2 つのサブツリーが生成され、各ツリーには少なくとも 1 つの Red ノードが含まれます。

C. B で作成された各サブツリーに複数のレッド ノードが含まれている場合は、ステップ A に戻ります。

これは O(V log V) (|E| は |V| -1 ) です。

于 2012-06-20T20:31:19.840 に答える
0

http://www.cs.ust.hk/mjg_lib/Classes/COMP572_Fall06/Notes/Tree_Multicut.ps

アルゴリズムの説明があります。

Postscript ファイルのGoogle HTML バージョン

=========================================

http://dspace.mit.edu/bitstream/handle/1721.1/5394/OR-308-95.pdf?sequence=1

k = 2 の場合は、マルチウェイ カット問題の唯一の多項式解法ではありません。Lovdsz [12] と Cherkasskij [3] は、ce = 1 Ve EE で G がオイラーの場合、マルチウェイ カット問題が多項式で解けることを示しています。Erdos と Sz6kely [8] は、基になるグラフ G がツリーの場合、マルチウェイ カット問題の一般化が多項式で解けることを示しました。ダルハウスら。アル。[7] は、問題が平面グラフ上の固定 k に対して多項式で解けることを示しています。

私は昨夜、2 つの赤い (ターミナル) ノード間のパス上にないノードを削除し、最小の重みノードを選択し、サブツリーでプロセスを繰り返すという単純な貪欲なアルゴリズム ベースのソリューションを作成しました。さらに読むと、問題はNPであることが示唆されたため、削除しました。しかし、この参考文献は、多項式の解があることを示唆しています...

于 2012-06-20T08:08:19.217 に答える
0

次の提案が機能するはずだと思います。

  • 1)爆弾から始めます。あなたの例では、次から始めます。0
  • 2) すべての隣接ノードにパスを作成します。だから、すべての関係を取り、彼らと一緒に道を歩み始めてください. あなたの例では、1つのパスを開始します: 0 -> 1.
  • 3) パス上で別の爆弾をヒットした場合、コストが最も低いエッジを削除します。この例では爆弾を打っていないので、ステップ 2 に進みます。
  • 3A) どのパスにもまだ爆弾はありません。手順 2 に進み、新しい隣接ノードでパスを延長します。あなたの場合、新しいパスが作成されます: 1 -> 3. そして、既存のものは拡張されます:0 -> 1 -> 2
  • 3B) 途中で爆弾が見つかりました。爆弾が見つかったパスをたどり、コストが最も低いエッジを削除します。あなたの例では、パス0 -> 1 -> 2に爆弾が含まれています(2)。そのため、コスト 5 の関係を削除します。「todo」からパスを削除し、最後に到達したノード (2 と 3) で手順 2 を続行します。

最後に、各ノードを 1 回だけトラバースする必要があります。私が間違っていなければ、複雑さは約O(n log n)であるはずです

于 2012-06-19T09:27:33.747 に答える