N個の重み付き頂点とN-1個のエッジを持つグラフを3つの部分に分割して、各部分のすべての頂点の重みの合計の最大値が最小になるようにします。これは私が解決しようとしている実際の問題です、http://www.iarcs.org.in/inoi/contests/jan2006/Advanced-1.php
次の方法を考えました
/*Edges are stored in an array E, and also in an adjacency matrix for depth first search.
Every edge in E has two attributes a and b which are the nodes of the edge*/
min-max = infinity
for i -> 0 to length(E):
for j -> i+1 to length(E):
/*Call depth first search on the nodes of both the edges E[i] and E[j]
the depth first search returns the sum of weights of the vertices it visits,
we keep track of the maximum weight returned by dfs*/
Adjacency-matrix[E[i].a][E[i].b] = 0;
Adjacency-matrix[E[j].a][E[j].b] = 0;
max = 0
temp = dfs(E[i].a)
if temp > max then max = temp
temp = dfs(E[i].b)
if temp > max then max = temp
temp = dfs(E[i].a)
if temp > max then max = temp
temp = dfs(E[i].a)
if temp > max then max = temp
if max < min-max
min-max = max
Adjacency-matrix[E[i].a][E[i].b] = 1;
Adjacency-matrix[E[j].a][E[j].b] = 1;
/*The depth first search is called four times but it will terminate one time
if we keep track of the visited vertices because there are only three components*/
/*After the outer loop terminates what we have in min-max will be the answer*/
上記のアルゴリズムはO(n ^ 3)時間かかります。これは、エッジの数がn-1になるため、外側のループが(n-1)実行されるためです。O(n ^ 2)かかる時間、dfsは各頂点に1つだけアクセスするため、O(n)時間になります。
ただし、問題は、nが<= 3000になる可能性があり、O(n ^ 3)時間がこの問題に適していないことです。リンク内の質問の解決をn^3より速く計算する他の方法はありますか?
編集:
@BorisStrandjevのアルゴリズムをcに実装しました。質問のテスト入力に対して正しい答えが得られましたが、他のすべてのテスト入力に対しては間違った答えが得られました。ここにideonehttp://ideone.comのコードへのリンクがあります。 / 67GSa2、ここでの出力は390であるはずですが、プログラムは395を出力します。コードに間違いがないか調べようとしていますが、何も表示されません。誰かがここで私を助けてくれますか?私のコードが与えた答えは正解に非常に近いので、アルゴリズムに何か他のものがありますか?
編集2:
次のグラフでは-@BorisStrandjev、アルゴリズムは反復の1つでiを1、jを2として選択しますが、3番目の部分(3,4)は無効です。
編集3
私はついに私のコードに間違いを犯しました。V[i]がiとそのすべての子孫の合計を格納する代わりに、V [i]とその祖先を格納しました。そうでなければ、上記の例を正しく解決します。 。