https://www.luogu.org/problem/P3381
タイトル説明
その場合、ネットワーク図、ソース及びシンク、各側面部所与の最大流量の場合には最大流量と最小コストネットワークを決定する最大流量とトラフィック電荷を、知られています。
入力形式
最初の行は、4つの正の整数であり、それぞれN、M、S、T、点の数が含まれ、エッジの数、数のソース、シンクポイント数が存在します。
次のMラインは、4つの整数UI、VI、WI、Fiが含まれてそこからエッジまでのUI i番目を示し、単位流量当たり、VI、WIの右側(最大流量のWiの、すなわち、側)に到着します手数料Fiを提供しています。
出力フォーマット
最大流量条件で最大流量と最小コストに続く2つの整数を含む1行。
エントリー
4 5 4 3 4 2 30 2 4 3 20 3 2 3 20 1 2 1 30 9 1 3 40 5
輸出
最小コスト最大フローテンプレート
50 280
1の#include <stdio.hの> 2の#include < 文字列・H> 3。の#include <キュー> 4。 の#define MEM(A、B)のmemset(A、B、はsizeof(A)) 5。 使用した 名前空間STD; 6 のconst int型 = 1E5 + MAXN 10 ; 図7 のconst int型 INF = 0x3f3f3f3f ; 8 。9 INT N-、M、ST、ED; // 縁ソースシンクの数を数える 10 INT VIS [MAXN]、DIS [MAXN]、フロー[MAXN]。// コストおよび流動点Iにソース 。11 INTは [MAXN】予め; // 前駆体を各点について 12は、 INT ;最終[MAXN] // 前縁の各点は、接続 13である INT minCost、MaxFlow; 14キュー< INT > Q; 15 16 構造体エッジ 17。 { 18は int型、次に、フロー、DISに; // 料として最短ランにDIS 。19 }エッジ[MAXN]; 20は int型、CNTヘッド[MAXN]; 21は 22である ボイド追加(int型 A、int型 B、int型 C、INT D)// 操作側からゼロに使用^そう 23 { 24 エッジ[CNT ++] .TO = B; 25 エッジ[CNTは] = .next ヘッド[A]、 26である エッジ[CNT] .flow = ; C 27 エッジ[CNT]は.DIS = D; 28 頭[A] = CNT; 29 } 30 31である BOOL SPFA(int型 ST、INT ED)の 32 { 33は MEM(DIS、INF)、MEM(流量、INF)、MEM(VIS、0); // 最大流量との最短(最小コストを見つけます。 ) 34である )Q.push(ST; 35 VIS [ST] = 1 ; 36 DIS [ST] = 0 ; 37 [ プレ[ED] = - 1 。 38 ながら(!Q.empty()) 39 { 40 INT今= Q.front()。 41 Q.pop()。 42 VIS [今] = 0 ; 43 のために(int型 - ;!I = I =ヘッド[今] 1 ; I = エッジ[I] .next) 44 { 45 であれば(エッジ[I] .flow> 0 && DIS [エッジ[I] .TO]> DIS [今] + エッジ[I] .DIS) 46 { 47の DIS [エッジ[I] .TO] = DIS [今] + エッジ[I] .DIS。 48 あらかじめ[エッジ[I] .TO] =今; // 前駆後に更新され、新しいレコード 49 ;最終[エッジ[I] .TO] = I // 更新するために、バックエッジに新しいエッジの前に更新記録した後流量は 50 流量[エッジ[I] .TO] =分([今]エッジを流れる[I] .flow); // 最大流量見つける 51は IF(!VIS [エッジ[I] .TO]) 52である { 53れます VIS [エッジ[I] .TO] = 1 ; 54である Q.push(エッジ[I] .TO); 55 } 56れる } 57はである } 58 } 59 リターン予め[ED] =! - 1。; 60 } 61 62 空隙min_cost_max_flow() 63 { 64 ながら(spfa(ST編)) 65 { 66 INT今= ED。 67 maxflow + = 流量[ED]。 68 mincost + =流量[ED] * DIS [ED]。 69 ながら(!今= ST)// 从汇点回溯更新边剩下的流量 70 { 71 エッジ[最後[今]フロー- = [ED]を流れます。 72 エッジ[最後[今] ^ 1 ] .flow + = 流[ED]。 73 今=事前に[今すぐ]。 74 } 75 } 76 } 77 78 のint main()の 79 { 80 MEM(ヘッド、 - 1)、CNT = - 1 。 81 のscanf(" %D%D%D%D "、&N、&M、&ST&ED)。 82 のために(int型 I = 1 ; I <= M Iは++ ) 83 { 84 int型A、B、C、D。 85 のscanf(" %D%D%D%D "、&A、&B、&C、およびD)。//点は、単位コストが縁有し開始および終了する容量 86 、追加(A、B、C、D)を 87 追加(B、A、0、-d); // 逆側流がゼロである、それは負かかり 88 } 89 min_cost_max_flowを(); 90 のprintf(" %D%D \ N- " 、MaxFlow、minCost); 91である リターン 0 ; 92 }