BZOJ 1497 NOI2006 最大獲利

2022-05-08 05:00:12 字數 1243 閱讀 4965

從原點向每個中轉站建立容量為 $ p_i $ 的邊,再從中轉站向以它作為條件的使用者群建立 $ +\infin $ 的邊,最後從使用者群向匯點建立 $ c_i $ 的邊,醫院的權值和 - 最小割就是答案。

為什麼這樣是對的呢?考慮我們滿足乙個使用者組的需求,無非就是不要這個需求(割掉這個邊)或者花代價去割掉它的 $ a_i,b_i $ ,這樣做它的盈利是 $ c_i - p_a-p_b $ 。所以最後求和 c 減去最小割就是答案。

#include "iostream"

#include "algorithm"

#include "cstring"

#include "cstdio"

#include "queue"

#include "cmath"

#include "vector"

using namespace std;

#define mem(a) memset( a , 0 , sizeof a )

#define maxn 6006

#define inf 0x3f3f3f3f

typedef long long ll;

class maxflow

public:

std::queueq;

std::vectorhead, cur, nxt, to, dep;

std::vectorcap;

maxflow(int _n = 0)

void init(int _n)

void init()

int add(int u, int v, ll w)

void del(int x)

bool bfs(int s, int t, int delta) }}

return ~dep[t];

}ll dfs(int u, ll flow, int t, int delta)

}return out;

}ll maxflow(int s, int t)

}return out;

}ll getflow(int x) const

} f ;

int n , m , s = 60001 , t = 60002;

int p[maxn];

long long s;

int main()

cout << s - f.maxflow( s , t ) << endl;

}

BZOJ1497 NOI2006 最大獲利

什麼是最大權閉合子圖 先解釋一下有向圖的閉合圖 閉合圖內任意點的任意後繼也一定還在閉合圖中。物理意義 事物間依賴關係 乙個事件要發生,它需要的所有前提也都一定要發生。最大權閉合圖 點權之和最大的閉合圖 最大權閉合圖構圖方法 1.增加源s匯t 2.源s連線原圖的正權點,容量為相應點權 3.原圖的負權點...

bzoj 1497 NOI2006最大獲利

我對題意的理解 給出一堆公司和一堆使用者,我們買公司需要花錢,每個使用者會支付報酬當且僅當他所鍾愛的兩個公司我都買了,問最大獲利 最大權閉合子圖 好厲害的樣子 首先我們連邊最小割ans 答案就是sum ans 這個可以想,sum表示在不需要支出的情況下的獲利,現在我們需要支出,所以要跑一遍最小割。感...

bzoj1497 NOI2006 最大收益

最小割 思路比較簡單 點數看起來很多但是因為是類似二分圖的東西所以跑的比較快 源點對每個使用者連容量為收益的邊 使用者向中轉站連容量無窮大的邊 中轉站向匯點連容量為成本的邊 要麼割掉使用者帶來的收益 要麼割掉成本 include include include using namespace std...