N
頂点に 1 から N の番号が付けられた無向木があるとします。各エッジ ツリーにはある程度の容量があります。考えられるすべての頂点のペア間の最大フローの合計を見つけます。任意の 2 つの頂点間を移動する方法は 1 つしかありません。
考えられるすべての頂点のペア間の最大フローの合計を見つけます。
例: 3 つのエッジを持つ特定のツリーでは
1 2 5
2 3 6
、ノード 1 とノード 2 の間のエッジは容量 5、ノード 2 とノード 3 の間は容量 6 です。
Output - 32
(1,2) = (2,1) = 5
(1,3) = (3,1) = 5
(2,3) = (3,2) = 6
したがって、出力は(5+5+6)*2 = 32
私のアプローチ-
Sort
edge_capacity に基づくエッジWhile
edge_list
isnot empty
: 最小限の容量でエッジを削除- このエッジ上
left
のノードの数を数えます。right
ノード数の DFS を実行する - 答えに (
left_count
*right_count
* ) を追加します。edge_capacity
- このエッジ上
戻り
answer*2
ます。
時間計算量は O(n 2 ) です。このソリューションは TLE を提供します。
時間の複雑さをさらに軽減するにはどうすればよいでしょうか?
私のコード-
def dfs(node):
count = 1
visited = set()
stack = [node]
while stack:
vertex = stack.pop()
if vertex not in visited:
visited.add(vertex)
stack.extend(set(nodes[vertex]) - visited)
return len(visited)
for _ in range(int(raw_input())): # Iterate for multiple test cases
MOD = 1000000007
edges = []
n = int(raw_input()) # number of vertices
nodes = [set() for _ in range(n)]
for __ in range(n-1): # read input for number of edges
edges.append(map(int, raw_input().split()))
nodes[edges[-1][0]-1].add(edges[-1][1]-1)
nodes[edges[-1][1]-1].add(edges[-1][0]-1)
edges[-1][0]-=1; edges[-1][1]-=1;
edges.sort(key=lambda x: x[2])
answer = 0
for i in range(len(edges)):
weight = edges[i][2]
x, y = edges[i][0], edges[i][1]
nodes[x].remove(y)
nodes[y].remove(x)
left_count = dfs(x)
right_count = dfs(y)
answer += ((left_count*right_count*weight)%MOD)
print (answer*2)%MOD
元の問題へのリンク -
Spoj-Flow on Tree
アップデート
制約-
- テストケース数 - 10
- 1 <= N <= 10 5 (各テスト ケースの頂点の数)
- 各エッジの容量は負ではなく、10 6を超えません。
- すべてのテスト ケースの頂点の総数は 5*10 5未満になります。