最小コストの最大流量ロスバレー1251

質問の意味:

これは、最小コスト(コストは一価の)トピック最大流量です。

まず、我々はポイントを分割し、1日の朝に分割し、夜になる、毎晩汚いナプキン(出典:理解しやすいで、この質問の起源から得るために、朝のナプキンを使用済み)になり、毎朝きれいなナプキンがあります(ソース:買う、迅速な洗浄ショップ、遅い洗浄ショップ)。

1.出発点から汚れたナプキンの記事xを得るために毎晩示す、0コスト面、ナプキンXと同じ日に、毎日トラフィックに原点からも夜に。

朝からでも流量が、日中は一日あたりの0のコスト面のためのミーティングポイントまで毎日と、その日ナプキン2のx、シンクをきれいに表現Xバーナプキンを提供するには、時間をかけてI-日ナプキン十分な流れを表しています。(汚れたナプキンは、午前中に使用することはできませんので、ない朝のノート)次の夜均等に各夜から3.次の夜に残すことができ、毎晩汚れたナプキンを示すフローINF、0コスト面であり、 。

この日+その1朝INFのない均一な流れ、毎晩示すために使用されるお金迅速な洗浄のコストエッジ量と日数T1の数の迅速な洗浄に毎晩4.私+ T1で、迅速な洗浄ユニットを送信することができますレシートナプキン朝の日。

同様に、日t2の朝の数を洗う夜から一日+遅くまで毎日、INF、毎晩表現する側に使用する金額のコスト遅いウォッシュとしていなくても、トラフィックその日は地面の上に、遅い、洗濯機に送信することができます5。私はナプキンを受け取ったT2朝+。

スタートから朝まで6. INF、ナプキンのお金のエッジの数を購入するための費用にもないトラフィック毎日は、ナプキンを買うために毎朝表します。上記6:00裏側を構築する必要があることに注意してください!3-6点(すなわち、側面が<= nに接続されるように)判断を行うために必要

1の#include <cstdioを>
 2の#include <キュー>
 3の#include <CStringの>
 4の#include <キュー>
 5の#include <アルゴリズム>
 6  の#define INF 2147483647
 7  の#define LL長い長い
 8  使用 名前空間STD。
9  のconst  int型 MAXN = 1E5 + 10 10キュー< 整数 > Q;
11  int型 N、M、M1、T1、M2、T2、NUM = - 1 、ST、ED。
12  構造体ノード{
 13      int型のU、V、W、コスト、次。
14 } G [MAXN]。
15  INTはB [MAXN]、ヘッド[MAXN]、あらかじめ[MAXN]、POS [MAXN]、[MAXN] max_flow。
16の LL DIS [MAXN]。
17  BOOL VIS [MAXN]。
18  ボイドビルド(int型 U、int型 V、INT、W INTのコスト)
 19  {
 20      G [++ NUM] .U = U、G [NUM] .V = V; G [NUM] .W = W; G [ NUM] .cost =コスト; G [NUM] .next =頭部[U];頭部[U] = NUM。
21      G [++ NUM] .U = V; G [NUM] .V = U、G [NUM] .W = 0 ; G [NUM] .cost = -COST; G [NUM] .next =ヘッド[V ];頭部[V] = NUM。
22  }
 23  ブールspfa()
 24  {
 25     memsetの(VIS、はsizeof (VIS));
26      VIS [ST]は= ;
27      のmemset(DIS、63はsizeof (DIS))。
28の      DIS [ST] = 0 ;
29      max_flow [ST] = INF。
30      q.push(ST)。
31      ながら(!q.empty()){
 32          INT U = q.front()。
33          VIS [U] = 34          q.pop()。
35          のためにint型 I =ヘッド[U]; I =! - 1 ; I =G [i]が.next){
 36              のint V = G [I] .V。
37              であれば(G [i]が.Wは> 0 && DIS [V]> DIS [U] + G [i]が.cost){
 38の                  DIS [V] = DIS [U] + G [i]が.cost。
39台の                  POS [V] = U。
40の                  プレ[V] = I。
41                  max_flow [V] = 分(max_flow [U]、G [i]が.W)。
42                  であれば(VIS [V]){
 43                      q.push(V)。
44                      VIS [V] = 45                  }
 46              }
 47          }
48      }
 49      リターン DIS [ED] < 4557430888798830399 50  }
 51  LLの流れ()
 52  {
 53の      LLのANS = 0 54      一方(spfa()){
 55の          ANS + = max_flow [ED] * DIS [ED]。
56          のためには、int型 I =編; I = ST;!私= POS [I]){
 57              G【中古[I] = W-。max_flow [ED]。
58              G [プレ[I] ^ 1 ] .W + = max_flow [ED]。
59          }
 60      }
 61      リターンANS;
62  }
 63  のint main()の
 64  {
 65      のint X;
66      のscanf(" %d個"、&N)
67      ST = 0、ED = 2 ×n個+ 1 ;
68      のmemset(ヘッド、 - 1はsizeof (ヘッド))。
69      のためには、int型 i = 1 ; iが<= N; iが++ ){
 70          のscanf(" %dの"、およびX)
71          ビルド(ST、I、X、0);// 毎晩得汚れたストリップナプキンから始まるのx 
72          ビルド(N-iは+、EDは、xは、0); // ナプキンxは、記事をシンクきれいにして日中は毎日、時間をかけi日のナプキンに十分な流れを表し、
73である     }
 74      scanfの(" %D%D%D%D%D "、&​​M、&T1、&M1、&T2、およびM2)、
 75      のためにINT I = 1 ; Iは<= N-; Iは++ ){
 76          IF( + I 。1のビルド<= N-)(I、Iは、+ 1。、INF、0); // 汚い、次の夜用ナプキンのために毎晩
77          IF(T1 + I <= N-)(ビルド・I、I + N- + T1、INF、M1); // すべての夜は迅速な洗浄ユニットを送信することができ、I + T1の朝ナプキンで受信した
78          IF(I、I + N - + T2、INF、M2)をビルドします(私は<= N- T2 + 1); // 毎晩遅く洗浄ユニットに送信することができ、I + T2の朝ナプキンで受信した
79          ビルド(ST、I N- +、INF、M); // 後ナプキンができる毎朝
80      }
 81      のprintf(" %のLLDを" 、フロー());
 82 }

 

おすすめ

転載: www.cnblogs.com/pangbi/p/11577720.html