P4014分布最小コスト最大

  

タイトル説明

あり  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:  コピー
5 
2 2 2 1 2 
2 3 1 2 4 
2 0 1 1 1 
2 3 4 3 3 
3 2 1 2 1
出力サンプル#1:  コピー
5 
14

説明

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] = - 1q.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は、追加10)、追加(iは、N T + 10 );} 
    MCMF(S、T)。
    coutの << mincost << てendl; 
    
    その中に(); 
    担当者(I、1、n)の担当者(J、1、n)の追加(I、J + N、1、 - MP [I] [J])。
    担当者(I、1、N){追加(S、iは、10)、(I + N、T、追加10 );} 
    MCMF(s、t)を。
    coutの << - mincost。

    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/bxd123/p/10944026.html