BZOJ1061: [Noi2008]志願者招募 && 單純形學習筆記
題目
題解
終於搞完了單純形,還真不是個簡單的東西,但是理解之後,演算法挺簡單的,證明只有自動略過了qwq。
學習單純形推薦算導29章,嚴密又不失詳細。
標準的線性規劃式子是,
大小的話A為m* n,b為m* 1,c為1* n,a為1 *n.c右上角的T表示轉置。
會出現一些問題使得它不是個標準型。有以下幾種
1.MAX函式是MIN,對目標函式f取負改成MAX即可
2.變數
3.是等式約束,不是不等式約束(不等式約束不能是嚴格不等),如果有
4.是>=而不是<=兩邊同時乘一個符號即可。
化成這樣之後化成鬆弛型線性規劃式子。(N是非基變數集合,即化成鬆弛型之後在右邊的變數)
弄好了之後,為了方便解,一般要變成一種鬆弛型的等式形式。即對於第i個約束
變成
即可,後續還會對這個式子進行變形,一個定義,等號左邊的變數叫做基本變數,右邊的叫非基變數,然後把原函式值用z代替,用N表示非基變數集合,B表示基本變數集合。
好像這裡需要初始化一下以保證初始基本解可行,因為本題特殊,只需要對偶一下就可以,對偶的具體操作以及後續計算可以看這裡–傳送
然後反覆使用單純形法,感覺就是不斷增加z的表示式中的v,不斷拿一個基變量出來和非基變數進行替換(即pivot操作),直到
後續初始化還要學學.學的還很多
以及這道題很神的費用流做法,以及啥是zkw費用流,提及zkw的話還有,zkw線段樹qwq。
程式碼
相當於自己的一個板子啦qwq。
//QWsin
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const double eps=1e-7;
const int maxm=10000+10;
const int maxn=1000+10;
const double INF=(1ull<<63);
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
return x*f;
}
int n,m;
double c[maxn],b[maxm],cof[maxm][maxn];
//who in ,who out , the ans
inline void Pivot(int in,int out,double &z)
{
b[out]/=cof[out][in];
cof[out][in]=1/cof[out][in];
for(int i=1;i<=n;++i) if(i!=in) cof[out][i]*=cof[out][in];
for(int i=1;i<=m;++i) if(i!=out && fabs(cof[i][in]) > eps )//fabs(cof[out][in]) > eps 你這樣寫是會把剪枝去掉然後T到飛起的
{
b[i]-=b[out]*cof[i][in];
for(int j=1;j<=n;++j) if(j!=in) cof[i][j]-=cof[out][j]*cof[i][in];
cof[i][in]=-cof[i][in]*cof[out][in];
}
z+=c[in]*b[out];//v增加的量
for(int i=1;i<=n;++i) if(i!=in) c[i]-=c[in]*cof[out][i];
c[in]=-c[in]*cof[out][in];
}
inline double Simplex()
{
double z=0;
while(1)
{
int in,out;
for(in=1;in<=n;++in) if(c[in]>eps) break;
if(in==n+1) break;//not found
double jin=INF;//find the YveShu that is the most Jin
for(int i=1;i<=m;++i) if(cof[i][in] > eps && b[i]/cof[i][in]<jin)
jin=b[i]/cof[i][in],out=i;
if(jin==INF) return INF;
Pivot(in,out,z);
}
return z;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i) c[i]=read();
for(int i=1,s,t;i<=m;++i)
{
s=read();t=read();
for(int j=s;j<=t;++j) cof[i][j]=1;
b[i]=read();
}
printf("%lld\n",(long long)(Simplex()+0.5));
return 0;
}
相關推薦
BZOJ1061: [Noi2008]志願者招募 && 單純形學習筆記
題目 題解 終於搞完了單純形,還真不是個簡單的東西,但是理解之後,演算法挺簡單的,證明只有自動略過了qwq。 學習單純形推薦算導29章,嚴密又不失詳細。 標準的線性規劃式子是,A=(aij),b=(bi),c=(ci),x=(xi) 大小的話A
bzoj 1061 [Noi2008]志願者招募 單純形演算法
Description 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了一個難 題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要N
[BZOJ1061][NOI2008]志願者招募(費用流神題單純形裸題)
題目描述 傳送門 題解 關於費用流的神建圖我無言以對。 轉自神犇的部落格:https://www.byvoid.com/blog/noi-2008-employee/ 關於單純形。。。裸題
bzoj1061 [Noi2008]志願者招募(網路流解決線性規劃問題)
bzoj1061 [Noi2008]志願者招募 題意: 一個專案需要N 天才能完成,其中第i 天至少需要Ai 個人。一共有M 類志願者可以招募。其中第i 類可以從第Si 天工作到第Ti 天,招募
bzoj1061 [Noi2008]志願者招募(線性規劃/費用流)
這題太神了!但是聽說是單純形法求解線性規劃裸題???看樣子網路流和線性規劃有著莫大的聯絡啊,待研究。 此題基本就是用網路流求解了一個等式的最優解? 附上大神題解:https://www.byvoid
[BZOJ1061][NOI2008]志願者招募 費用流
/************************************************************** Problem: 1061 User: di4CoveRy Language: C++ Resul
bzoj1061: [Noi2008]志願者招募 費用流
首先貼個線性規劃原問題模型: max c1x1+c2x2+...cnxn 約束條件 ai1x1+ai2x2+...ainxn>=bi ai1x1+ai2x2+...ainxn=bi ai1x1+ai2x2+...ainxn<=bi ai1x1+ai2x2+...
【BZOJ1061】[Noi2008]志願者招募【單純形法】
雙倍經驗題,BZOJ3265。 先用對偶原則轉換成求對偶問題的解,這樣直接轉化成了標準型,然後跑Simplex就好了。 下面是對樣例的一個計算過程。 /* Footprints In The
【bzoj1061】[Noi2008]志願者招募
= =跟上一道基本相同,可以單純形法解線性規劃,也可以費用流. 寫費用流的話建圖就是一般的線性規劃轉費用流的套路,加上基變數,然後化成等式,每個下式減上式之後可以化成表示流量平衡的等式,然後根據等式建圖就好了,跑一個最小費用最大流. 寫單純形沒有寫網路流好理
[Noi2008]志願者招募(BZOJ1061)
相關連結: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 題目大意: 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了一個難 題:為即將啟動的奧運新專案招募一批短期志願
[NOI2008]志願者招募,洛谷P3980,線性規劃對偶定理以及整數解
正題 題目連結 這一題很容易構造一個線性規劃的模型。 對於每一天,在這一天的志願者的總和大於等於需要的人數,最小化每種志願者乘其單價費用的和。  
[BZOJ]4842: [Neerc2016]Delight for a Cat 1061: [Noi2008]志願者招募 費用流 線性規劃
題解: 把這兩道題目放在一起寫,因為做法是一樣的。 兩題都是經典的線性規劃問題,但同時也都可以用費用流解決。 以志願者招募這題為例,首先設第 i
【BZOJ 1061】 1061: [Noi2008]志願者招募 (線性規劃與網路流)**
1061: [Noi2008]志願者招募 Description 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了一個難 題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要N 天才能完成,其中第i 天至少需要 Ai 個人。 布布通過了解得知
BZOJ 1061 [Noi2008]志願者招募 線性規劃
題意:連結 方法:線性規劃 解析: 不妨對樣例加以闡釋 3 3 2 3 4 1 2 2 2 3 5 3 3 2 不妨設Xi代表第i種志願者選Xi個人 那麼顯然,這題的限制為 X1>
洛谷 P3980 [NOI2008]志願者招募 費用流
題目描述 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了一個難題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要N 天才能完成,其中第i 天至少需要Ai 個人。 布布通過了解得知,一共有M 類志願者
【BZOJ 1061】 [Noi2008]志願者招募
1061: [Noi2008]志願者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2066 Solved: 1282 [Submit][Status] Description 申奧成功後,布布經過不懈努力,終於
BZOJ1061 [Noi2008]誌願者招募 【單純形】
OS 分享 pri 標準 fin getc set splay http 題目鏈接 BZOJ1061 題解 今天終於用正宗的線性規劃\(A\)了這道題 題目可以看做有\(N\)個限制和\(M\)個變量 變量\(x_i\)表示第\(i\)種誌願者的人數,對於第\(i\)種誌願
BZOJ 3265 志願者招募加強版(單純形)
3265: 志願者招募加強版 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 848 Solved: 436[Submit][Status][Discuss] Des
學習筆記第三十二節:線性規劃與單純形
正題 我們今天講一下線性規劃,以這一道題為例:#179. 線性規劃 首先面對一堆小於等於的約束,我們應該怎麼做? 我們以樣例來解釋: &nb
【NOI2008】BZOJ1061志願者招募
1061: [Noi2008]志願者招募 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 3028 Solved: 1872 Description 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司