洛谷 P3980 NOI2008 志願者招募

2022-05-08 03:21:13 字數 2444 閱讀 6267

我居然現在才會用費用流解線性規劃……

當然這裡解決的一類問題比較特殊

以式子作為點,變數作為邊,然後要求就是變數在不同的式子裡出現了兩次,係數一次為+1,一次為-1

這樣的話就作為了乙個出度和乙個入度,和邊正好對應了

我們設每種志願者選擇人數是\(x_\)

我們的限制是

\[\left\

x_ \geq 0\\

x_ + x_ \geq a_\\

x_ + x_ \geq a_\\

x_ + x_ \geq a_

\end\right.

\]假如資料是這樣的吧~

但是我們需要流量平衡,於是我們新加幾個變數

\[\left\

x_ \geq 0\\

y_ \geq 0\\

x_ + x_ - y_ - a_ = 0\\

x_ + x_ - y_ - a_ = 0\\

x_ + x_ - y_ - a_ = 0

\end\right.

\]然後呢我們在前面和後面補上0 = 0

差分後就是

\[\left\

x_ \geq 0\\

y_ \geq 0\\

x_ + x_ - y_ - a_ = 0\\

x_ + x_ - y_ - a_ = 0\\

x_ + x_ - y_ - a_ = 0

\end\right.

\]\[\left\

x_ \geq 0\\

y_ \geq 0\\

x_ + x_ - y_ - a_ = 0\\

-x_ + x_ - y_ + y_ + a_ - a_ = 0\\

-x_ + x_ - y_ + y_ + a_ - a_ = 0 \\

-x_ - x_ + y_ + a_ = 0

\end\right.

\]這樣的話就滿足我們的限制了

我們對於每個式子建乙個點,我們把\(-x_\)的式子向\(x_\)連一條邊,容量為正無窮,費用為志願者的費用

\(y\)同理,不過費用是0

然後再看常數項,如果常數項是負的,則向匯點流一條容量為常數項絕對值的邊,如果是正的,則源點向這個式子流一條容量為常數項的邊

#include #define fi first

#define se second

#define pii pair#define mp make_pair

#define pb push_back

#define space putchar(' ')

#define enter putchar('\n')

#define eps 1e-10

#define ba 47

#define maxn 200005

//#define ivorysi

using namespace std;

typedef long long int64;

typedef unsigned int u32;

typedef double db;

templatevoid read(t &res)

while(c >= '0' && c <= '9')

res *= f;

}templatevoid out(t x)

if(x >= 10)

putchar('0' + x % 10);

}struct node e[1000005];

int head[1005],sume = 1,ncnt,s,t,cur[1005];

int64 ans;

int n,m;

int st[10005],ed[10005],cs[10005],a[1005];

bool vis[1005];

void add(int u,int v,int c,int a)

void addtwo(int u,int v,int c,int a)

int64 dis[1005];

bool inq[1005];

queueq;

bool spfa() }}

}return dis[t] < 1e18;

}int dfs(int u,int aug)

vis[u] = 1;

for(int i = head[u] ; i ; i = e[i].next) }}

return 0;

}void mcmf() while(dfs(s,0x7fffffff));

}}void solve()

addtwo(s,n + 1,a[n],0);

for(int i = 1 ; i <= m ; ++i)

mcmf();

out(ans);enter;

}int main()

P3980 NOI2008 志願者招募 網路流

題意 一共有n 天 每天需要ai個志願者 有m種志願者 每種志願者可以從 第si 天工作到ti 天 每個需要ci元 問花最少的錢滿足每天的需求 顯然是費用流 如果正常連邊的話 每個志願者對其輻射的天非常難處理 可以採用時間軸的連法 源點連第一天 匯點連最後一天 容量為inf費用為0 這樣跑網路流是沿...

洛谷P3980 志願者招募

題意 懶得寫了.解 一開始想的是每天建點,每種人建點,然後連邊費用流,發現乙個人可以管轄多天,不好處理。回想起了網路流24題中的 最長k可重線段集 最長k可重區間集 等問題,然後發現這題也可以橫著流啊。具體來說,首先在下面開一條安全快速綠色通道,存放那些不用的人 流量 那麼每天要用怎麼辦?把人逼出去...

洛谷 P4768 NOI2018 歸程

題目 歸程 歸程 思路 1 一種海拔 30 求最短路。詢問時,海拔 0,輸出0 否則輸出dist v 2 鏈 15 離散化。預處理出不同海拔 每個點開始到起點的答案,查表輸出。3 樹 10 樹上倍增。4 kruskal重構樹 樹上倍增。做kruskal時,在並查集路徑壓縮時,同時存下樹的心態。即,在...