Ford-Fulkerson方法的修改

时间:2017-06-13 14:07:29

标签: algorithm graph-algorithm ford-fulkerson

我想在流量网络G中的所有最小切割中找到 积分容量,包含最小数量的边缘。我们怎么样 修改G的容量以创建一个新的流量网络G',其中任何最小值 切入G'是G中最小边数的最小切割。 来源 - Cormen

1 个答案:

答案 0 :(得分:2)

让我们说图Gn个顶点。

我们在e'中定义弧G'的容量,其对应eG的弧c(e') = c(e) * n + 1G'

因此,n中的切割值恰好是G中切割值+切割边缘数量的G'倍。

让我们说现在我们的n * x + a最小值为G。这意味着G中的切割值为x。如果y < x中的切割值较小n * y + b <= n * (y+1) <= n * x < n * x + a,则此切割的值为n * x + a,这与值为G'的切割相矛盾是G'中的最小值。我们刚刚证明G中的每个最小切割也是G'中的最小切割。但接下来,G中的最小值减少是G中的最小值,并且#!/usr/bin/env ruby require 'csv' @dictionary_data = CSV.open('dict_data.csv') { |csv| Hash[csv.map { |name, tag| [name[/^.+(?=-\w+$)/], tag] }] } @app_data = [{'name' => 'server_name1.sub.emea', 'tag' => 'Europe', 'state' => 'Online'}, {'name' => 'server_name2.sub.us', 'tag' => 'US E.', 'state' => 'Online'}, {'name' => 'server_name3.sub.us', 'tag' => 'US W.', 'state' => 'Failover'}] STATE_MAP = { 'Online' => 'Up', 'Failover' => 'F.O.' } @app_data = @app_data.map do |server| name = server['name'][/^[^.]+/] { 'name' => name, 'tag' => @dictionary_data[name], 'state' => STATE_MAP[server['state']], } end p @app_data # => [{"name"=>"server_name1", "tag"=>"Paris, France", "state"=>"Up"}, # {"name"=>"server_name2", "tag"=>"New York, USA", "state"=>"Up"}, # {"name"=>"server_name3", "tag"=>"Portland, USA", "state"=>"F.O."}] 中所有最小值的最小边数都为最小值。