1. 程式人生 > >BZOJ1061: [Noi2008]志願者招募 && 單純形學習筆記

BZOJ1061: [Noi2008]志願者招募 && 單純形學習筆記

題目

題解

終於搞完了單純形,還真不是個簡單的東西,但是理解之後,演算法挺簡單的,證明只有自動略過了qwq。

學習單純形推薦算導29章,嚴密又不失詳細。

標準的線性規劃式子是,A=(aij),b=(bi),c=(ci),x=(xi)
大小的話A為m* n,b為m* 1,c為1* n,a為1 *n.c右上角的T表示轉置。

MAXcTx Ax<=b x>=0

會出現一些問題使得它不是個標準型。有以下幾種
1.MAX函式是MIN,對目標函式f取負改成MAX即可
2.變數xi沒有非負約束,那麼拆成兩個變數xi=xix′′i,並且有xi>=0x′′

i>=0帶回原式即可。
3.是等式約束,不是不等式約束(不等式約束不能是嚴格不等),如果有X=b 拆為X<=b 並且 X>=b即可。
4.是>=而不是<=兩邊同時乘一個符號即可。

化成這樣之後化成鬆弛型線性規劃式子。(N是非基變數集合,即化成鬆弛型之後在右邊的變數)

弄好了之後,為了方便解,一般要變成一種鬆弛型的等式形式。即對於第i個約束

j=1naijxj<=b
變成
xi+n=bj=1naijxj
xi+n>=0
即可,後續還會對這個式子進行變形,一個定義,等號左邊的變數叫做基本變數,右邊的叫非基變數,然後把原函式值用z代替,用N表示非基變數集合,B表示基本變數集合。 z
=v+jNcjxj

xi=bijNaijxj(iB)

好像這裡需要初始化一下以保證初始基本解可行,因為本題特殊,只需要對偶一下就可以,對偶的具體操作以及後續計算可以看這裡–傳送

然後反覆使用單純形法,感覺就是不斷增加z的表示式中的v,不斷拿一個基變量出來和非基變數進行替換(即pivot操作),直到ci全部為負數,返回答案。

後續初始化還要學學.學的還很多

以及這道題很神的費用流做法,以及啥是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

NOI2008BZOJ1061志願者招募

1061: [Noi2008]志願者招募 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 3028 Solved: 1872 Description 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司