「24ネットワークフロー問題、」最長区間kの再集合

間隔のセットと、正の整数$がI $ $ K $を考えると、$ Iが計算$最大再$ kは$長間隔セット。

 

離散間隔$ [1,2n]を構成する$、$ S $と$ 1 $接続側$(K、0)$、$ iが$と$ I + 1接続$側$(K、0)$、$ 2N $エッジ$(K、0)$に接続$ Tの$(1、LR)$各ビン$(L、R)$、$ Lが$およびR&LT $ $ $接続されたエッジのために。

最大長に反対数の最小コスト

書式#include <iostreamの> 
の#include <sstream提供> 
する#include <アルゴリズム> 
書式#include <cstdioを> 
する#include <math.h>の
書式#include <設定> 
書式#include <マップ> 
書式#include <キュー> 
の#include <string>に
する#include < string.hの> 
の#include <ビットセット> 
の#include <unordered_map> 
の#define REP(I、N)のために(INT iは=; I <= N; ++ I)
の#define PER(I、N) - (I; I> = A I = N INT)のため
の#defineのHRのputchar(10)
の#define PB一back 
の#define LC(O << 1)
(| 1 LC)の#define RC 
の#define中間((L + R)>> 1)
の#define LSのLC、L、中
の#define RSのRC、ミッド+ 1、R 
の#define X最初
の#define yの第二
の#define IOのstd :: IOS :: sync_with_stdio(偽) 
の#define ENDL '\ n'は
#define DB(A)({REP(__ I、1、n)はCOUT << [__ I] <<」「;}時間)
名前空間stdを使用。
typedefの長い長いLL。
typedefのペア<int型、int型> PII。
CONST int型P = 1E9 + 7、P2 = 998244353、INF = 0x3f3f3f3f。
LLのGCD(-1,11,11- b)は{戻りB GCD(B、%のB):;} 
のLL qpow(-1,11,11- n)で{LLのR = 1%P;(%= Pのために、N ; = *%P、N >> = 1)であれば(N - 1)R = R *%のP、リターンR;} 
?LL INV(LL X){X <= 1を返す:INV(P%以下X)*(PP / X)%P;} 
インラインint型RD(){int型のx = 0; CHAR P = GETCHAR();一方、(P < '0' || P> '9')p = GETCHAR() ;一方、(P> = '0' && P <= '9')、X = X * 10 + P-'0' 、P = GETCHAR();戻りX;} 
//ヘッド


ONLINE_JUDGE用の#ifdef 
のconst int型N = 1E6 + 10; 
#else 
のconst int型N = 999。
#endifの};に、F、W。
ベクトル<_> E; 
ベクター<INT> G [N]。

構造体_ {から、F、W、にINT;};  
                    D [e.to] = D [X] + EF。
INT [N]、プリ[N]、INQ [N]、D [N]。
int型MF、MC。
キュー<整数> Q; 
ボイド追加(int型のx、int型のY、int型C、INT W){ 
    G [X] .pb(E.size())。
    E.pb({X、Y、C、W})。
    G [Y] .pb(E.size())。
    E.pb({Y、X、0、-w})。
} 
ボイドMFMC(){ 
	MF = MC = 0。
    (1){一方
        REP(I、1、T)[i]は= Dの[I] = INF、INQ [I] = 0; 
        q.push(S)、D [S] = 0; 
        一方、{(q.empty()!)
            INT X = q.front()。q.pop(); 
            [X] INQ = 0。
            以下のための(自動T:G [X]){ 
                オートE = E [T]。
                IF(EW> 0 && D [e.to]> D [X] + EF){
                    事前[e.to] = T。
                    【e.to] =分([X]、EW)。
                    もし{(INQ 
                        [e.to]!)[e.to] = 1 INQ。
                        q.push(e.to)。
                    } 
                } 
            } 
        } 
        もし([T] == INF)ブレーク。
        (INT U = T; U = S;!Uは= E [U]は[事前]から。)のために{ 
            E [プレ[U] W- = A [T]。
            E [プレ[U] ^ 1] .W + = [T]。
        } 
        MF + = [T]、MC + = [T] * D [T]。
    } 
} 


int型B [N]、L [N]、R [N]。
INTメイン(){ 
	scanf関数( "%d個の%のD"、&N&K)。
	REP(I、1、N){ 
		scanf関数( "%d個の%のD"、L + I、R + I)。 
		B [++ * B] = 1 [I]、B [++ * B] = R [i]は、
	} 
	ソート(B + 1、B + 1 + * B)、* B =一意(B + 1、B + 1 + * B)-b-1。
	REP(I、1、N){
		L [I] = LOWER_BOUND(B + 1、B + 1 + * B、L [I]) - B。
		R [I] = LOWER_BOUND(B + 1、B + 1件の+ * B、R [I]) - B。
	} 
	S = * B + 1、T = Sを+ 1。
	(S、1、K、0)を追加し、(* B、T、K、0)を加えます。
	REP(I、2、* B)(I-1、I、K、0)を加えます。
	REP(I、1、N)(L [i]は、R [i]は、1、-B [R [I] + B [L [I])を追加します。
	MFMC(); 
	printf( "%d個の\ n"、-mc)。
}

 

おすすめ

転載: www.cnblogs.com/uid001/p/10990261.html