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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
. (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 }