タイトル説明
あり N- に割り当てる作業のn個 のn 、nは-行う個人が。第 I Iは最初の個体で j個のワークピースjから生じる利益である のC_ {} IJ C I J 。う設計してみ N- に割り当てられた作業のn個 のn 発生する総最大の利益をもたらすのn-行う個人割り当て方式を、。
入出力フォーマット
入力フォーマット:
最初のファイル 1 行1が有する 1 正の整数を N- n-は、発現される N- に割り当てる作業のn個 のn N-行う個体。
次 のn のn行、各行が有する N- nは整数 のC_ {} IJ C I jは、を表し 、私は私が最初に個々こと J 操作部材によって生成された有効Jで のC_ {} IJ C I J 。
出力フォーマット:
2行は、最小の総出力効率と最大総利益です。
サンプル入力と出力
説明
1 \当量のn \の当量100 1 ≤ N ≤ 1 0 0
人は唯一のワークを修復することができます
水問題のコスト
彼が二度の最小値と最大値をしようとしている走りました
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 // BXDによる入力 の#define担当者(iは、b)のための(; iは=(b)の<I ++はiは(A)= INT) の#defineためreppを(I、B)(I =(A int型); I> =(B); - I) の#define RI(N)のscanf( "%d個"、&(N)) の#define RII(N、M)のscanf( "%D%dの"、およびN、 &M) の#define RIII(N、M、K)のscanf( "%D%D%D"、&N、&M&K) の#define RS(S)のscanf( "%sの"、S); #defineは長い長いっ の#define PB一back の#define INF 0x3f3f3f3f の#define CLR(A、V)のmemset(A、V、 1000001 ; INTのN、M、S、T、maxflow、mincost、最後[N]、プリ[N]、DIS [N]、[N]を流れます。 BOOL VIS [N]。 構造体のエッジ{ int型次へ、流れ、DIS。 }エッジ[N << 1 ]。 INT POS = 1 、頭部[N]。 ボイドのinit() { POS = 1 。 CLR(頭部、0 ); mincost = maxflow = 0 。 } キュー < INT > Q。 INTの ID(int型のx、int型の Y){ リターンN×(X- 1)+ Y;} ボイド追加(INT から、INTに、int型の流れ、INT DIS)// フロー流量DIS费用 { エッジ[ [++ POS] .next =先頭から]。 エッジ[POS] .flow = 流量; エッジ[POS] .DIS = DIS。 エッジ[POS] .TO = であり; 【ヘッドから =] POS。 エッジ[ ++ POS] .next = 頭部[します]。 エッジ[POS] .flow = 0 。 エッジ[POS] .DIS = - DISと、 エッジ[POS] .TO = から。 【へ】ヘッド = POS。 } BOOL spfa(INT S、INT T) { CLR(DIS、0x3fを)。 CLR(流量、0x3fを)。 CLR(VIS、0 ); しばらく(!q.empty())q.pop(); DIS [S] = 0 ; プレ[T] = - 1。q.push(S); VIS [S] = 1 。 int型 TOT = 0 ; しばらく(!q.empty()) { int型今= q.front()。q.pop(); VIS [今] = 0 ; 以下のために(int型 ; I I = I =ヘッド【今】エッジ[I] .next) { int型へ= エッジ[I] .TO。 もし (エッジ[I] .flow> 0 && DIS [に対する]> DIS [今] + エッジ[I] .DIS) { DIS [に対する] =エッジ[I] .DIS + [今] DIS。 【に】流れる = (エッジ[I] .flow、[今]流れ)分。 最後に[へ] = I; 【に】予め = 今。 もし(!VIS [へ]) { (へ)q.push。VIS [に対する] = 1 。 } } } } 戻りプレ[t]を=! - 1 。 } ボイド MCMF(INT S、INT T) { 一方(spfa(S、T)) { intは今= Tと、 maxflow + = 流量[T]。 mincost + =流量[T] * DIS [T]。 一方、(!今= S) { エッジ[最後[今]フロー - =流れる[T]。// DIS。フロー エッジ[最後[今] ^ 1 ] .flow + = 流れる[T]。 今 = あらかじめ[今]。 } } } 構造体ノード { int型、U、V、コスト。 }ノード[N]。 int型S、T、K。 INT MP [ 200 ] [ 200 ]。 INT メイン() { RI(N) S = 0、T = 2 * N + 1 。 担当者(I、1 、n)の 担当者(J、1 、N) { RI(MP [I] [J]);(I、J追加 + nは、1、MP [I] [J])。 } 担当者(I、1、N){(S、Iは、追加1、0)、追加(iは、N T + 1、0 );} MCMF(S、T)。 coutの << mincost << てendl; その中に(); 担当者(I、1、n)の担当者(J、1、n)の追加(I、J + N、1、 - MP [I] [J])。 担当者(I、1、N){追加(S、iは、1、0)、(I + N、T、追加1、0 );} MCMF(s、t)を。 coutの << - mincost。 リターン 0 ; }