我居然現在才會用費用流解線性規劃……
當然這裡解決的一類問題比較特殊
以式子作為點,變數作為邊,然後要求就是變數在不同的式子裡出現了兩次,係數一次為+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時,在並查集路徑壓縮時,同時存下樹的心態。即,在...