NOI 2006 最大獲利 最大流 經典問題

2021-09-25 19:02:02 字數 1549 閱讀 7851

這是一道經典問題——題記

結果我還wa了幾發沒找到原因,我們很容易想到這張圖的o(n + m)複雜度的建邊,我們把1~n的每個中轉站連線流為本身的需求到終點t,然後有m個事件,我們對應的連線到s上去,流為每個事件的價值。

然後就是用乙個總的價值去減去最大流,因為最大流跑出來的分為兩種情況:(一)、這個中轉站是我們要參與進來的;(二)、這個中轉站裡的費用是我們無意加進來的,實際上是不需要的(這時候肯定是事件產生價值小於了替換它的價值了)。

所以,最後直接用總的價值,減去最大流即可。

#include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) ( x&(-x) )

#define pi 3.141592653589793

#define e 2.718281828459045

#define inf 0x3f3f3f3f

#define half (l + r)>>1

#define lsn rt<<1

#define rsn rt<<1|1

#define lson lsn, l, mid

#define rson rsn, mid+1, r

#define ql lson, ql, qr

#define qr rson, ql, qr

#define myself rt, l, r

#define mp(x, y) make_pair(x, y)

using namespace std;

typedef unsigned long long ull;

typedef long long ll;

const int maxn = 55007, s = 0, maxe = 3.1e5 + 7;

int n, m, head[maxn], cur[maxn], cnt, t;

struct node

};struct eddge

}edge[maxe];

inline void addeddge(int u, int v, int flow)

inline void _add(int u, int v, int flow)

int deep[maxn];

queueq;

inline bool bfs()}}

return deep[t];

}int dfs(int u, int dist)}}

return 0;

}inline int dinic()

return ans;

}inline void init()

int main()

for(int i=1, u, v, w; i<=m; i++)

ans -= dinic();

printf("%d\n", ans);

return 0;

}

NOI2006 最大獲利

description 新的技術正衝擊著手機通訊市場,對於各大運營商來說,這既是機遇,更是挑戰。thu集團旗下的cs t通訊公司在新一代通訊技術血戰的前夜,需要做太多的準備工作,僅就站址選擇一項,就需要完成前期市場研究 站址勘測 最優化等專案。在前期市場調查和站址勘測之後,公司得到了一共n個可以作為...

NOI2006 最大獲利

有n個中轉站,每乙個中轉站修建需要耗費一定費用。有m個使用者人群,每個使用者人群要通話需要有a b 兩個中轉站,滿足這個使用者人群後會獲利p。問最大獲利是多少?有正權,有負權,還有依賴關係,決定就是你啦,最大權值閉合子圖!建模就不分析了,套路題目。luogu 4174 bzoj 1497 cogs ...

NOI2006 最大獲利

把使用者和中轉站分成兩類,就是乙個二分圖了。注意到我們選擇了乙個使用者群,就必須要選擇對應的中轉站來付出代價。這不就是乙個最大權閉合子圖嘛 直接上最小割即可 如下 include include include include include include define s 0 define t ...