루오 구 P3381 최소의 비용으로 최대 유량 템플릿

https://www.luogu.org/problem/P3381

제목 설명

그 경우, 네트워크도를 부여하고, 소스 및 싱크, 양쪽 장치가 최대 유량의 경우의 최대 유량과 최소의 비용으로 망을 판별 최대 흐름 및 교통 요금 알려져있다.

입력 형식

첫 번째 행은 네 개의 양의 정수 N, M, S, T, 각각의 포인트의 수는,이 엣지 수가 소스의 개수이다 소수점 수 싱크를 포함한다.

다음 M 라인은 네 개의 정수 UI, VI, WI, 인터넷을 포함 UI 번째 거기에서 에지 및 I를 나타낸다 VI에 도착 (Wi)의 우측 (즉, 최대 유량 (Wi)의 측면) 단위 유량 당 수수료 Fi를.

출력 형식

최대 유량 조건에서 최대 유량과 최소 비용 다음 두 정수를 포함하는 하나 개의 라인.

 기입 
4 5 4 3 
4 2 2 30 
4 3 20 3 
2 20 1 3 
2 1 9 30 
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.  은 USING  공간 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]가 다음 내용 = 헤드 [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          힘 [현재] = 0 ;
(43)          에 대한이 ( int로 -;! I = I = 헤드 [현재] 1 , I = 가장자리 [I]를 다음 내용)
 44          {
 45              의 경우 (에지 [I] .flow> 0 && DIS [에지 [I] .TO]> DIS [현재] + 에지 [I] .dis)
 46              {
 47                  DIS [에지 [I] .TO = DIS의 [현재] + 에지 [I] .dis;
(48)                 [엣지 [내가] .TO] = 현재 사전; // 새 레코드 전구체 후 업데이트 
49                  마지막으로 [엣지 [I]는 .TO] = 나는; // 뒤쪽 가장자리에 새 에지 전에 업데이트 녹화 후 업데이트 유속 
50                  유량 [엣지 [I]를 .TO = 분 ([현재] 에지 흐름 [I]는 .flow); // 최대 유동을 찾을 
51한다                  IF (! VIS는 [에지 [I] .TO])
 (52)가                  {
 53 인                      VIS [에지 [I]를 .TO = . 1 ;
 54이다                      Q.push EDGE ([I]를 .TO)
 (55)                  }
 (56)이다              }
 (57)이다          }
 58      }
 59       ! 미리 [ED] = - 1.;
60  }
 61  
62  공극 min_cost_max_flow ()
 63  {
 64      동안 (spfa (ST, ED))
 65      {
 66          INT 지금 = ED;
67          maxflow + = 유량 [ED];
68          mincost + = 유량 [ED] * DIS [ED];
(69)          동안 (현재 일 =!) // 从汇点回溯更新边剩下的流量
70          {
 71              가장자리 [최후 [현재] 유동 - =. 흘러 [ED];
72              가장자리 [최후 [현재] ^ 1 ] + = .flow 흐름 [ED];
(73)              이제 =[현재] 미리;
74          }
 75      }
 76  }
 77  
78  INT 주 ()
 79  {
 80      (MEM) (헤드 - 1 ), CNT = - 1 ;
81      는 scanf ( " % D % D % D % D " , 및 N, m, ST, 및 ED);
(82)      에 대한이 ( int로 I = 1 ; I <= m; 내가 ++ )
 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 }
최소 비용 최대 흐름 템플릿

 







추천

출처www.cnblogs.com/yuanweidao/p/11246839.html