bzoj1061 [Noi2008]志願者招募(線性規劃/費用流)
這題太神了!但是聽說是單純形法求解線性規劃裸題???看樣子網路流和線性規劃有著莫大的聯絡啊,待研究。
此題基本就是用網路流求解了一個等式的最優解?
附上大神題解:https://www.byvoid.com/zhs/blog/noi-2008-employee
upd:單純形確實很強orz,因為要求的這個東西不是標準型線性規劃,我們把他對偶了就可以了。
附上大神題解:portal
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1010
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,m,h[N],num=1,ans=0,dis[N],path[N],T=1005 ;
bool inq[N];
struct edge{
int to,next,w,c;
}data[25000];
inline void add(int x,int y,int w,int c){
data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].w=w;data[num].c=c;
data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].w=0;data[num].c=-c;
}
inline bool spfa(){
deque<int> q;memset(dis,inf,sizeof(dis));memset(path,0,sizeof(path));
q.push_back(0);inq[0]=1;dis[0]=0;
while(!q.empty()){
int x=q.front();q.pop_front();inq[x]=0;
for(int i=h[x];i;i=data[i].next){
int y=data[i].to;if(!data[i].w) continue;
if(dis[x]+data[i].c<dis[y]){
dis[y]=dis[x]+data[i].c;path[y]=i;
if(!inq[y]){
if(!q.empty()&&dis[y]<dis[q.front()]) q.push_front(y);
else q.push_back(y);inq[y]=1;
}
}
}
}return path[T];
}
int main(){
// freopen("a.in","r",stdin);
n=read();m=read();int last=0;
for(int i=1;i<=n;++i){
int x=read();if(x-last>0) add(0,i,x-last,0);
else add(i,T,last-x,0);last=x;
}add(n+1,T,last,0);
for(int i=1;i<=m;++i){
int x=read(),y=read(),val=read();add(x,y+1,inf,val);
}for(int i=1;i<=n;++i) add(i+1,i,inf,0);
while(spfa()){
int now=T,low=inf;
while(path[now]) low=min(low,data[path[now]].w),now=data[path[now]^1].to;
now=T;ans+=low*dis[T];
while(path[now]) data[path[now]].w-=low,data[path[now]^1].w+=low,now=data[path[now]^1].to;
}printf("%d\n",ans);
return 0;
}
單純形
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define eps 1e-7
#define N 1010
#define M 10010
#define inf 0x3f3f3f3f
int n,m;
double a[M][N],ans=0;
inline char gc(){
static char buf[1<<16],*S,*T;
if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
inline void pivot(int l,int e){
double t=a[l][e];a[l][e]=1;
for(int i=0;i<=n;++i) a[l][i]/=a[l][e];
for(int i=0;i<=m;++i){
if(i==l||abs(a[i][e])<eps) continue;
t=a[i][e];a[i][e]=0;
for(int j=0;j<=n;++j) a[i][j]-=a[l][j]*t;
}
}
inline bool simplex(){
while(1){
int l=0,e=0;double mn=inf;
for(int j=1;j<=n;++j) if(a[0][j]>eps){e=j;break;}
if(!e) return 1;
for(int i=1;i<=m;++i)
if(a[i][e]>eps&&a[i][0]/a[i][e]<mn) mn=a[i][0]/a[i][e],l=i;
if(!l) return 0;pivot(l,e);
}
}
int main(){
// freopen("a.in","r",stdin);
n=read();m=read();
for(int i=1;i<=n;++i) a[0][i]=read();
for(int i=1;i<=m;++i){
int x=read(),y=read();a[i][0]=read();
for(int j=x;j<=y;++j) a[i][j]=1;
}simplex();
printf("%d\n",-(int)a[0][0]);
return 0;
}
相關推薦
bzoj1061 [Noi2008]志願者招募(線性規劃/費用流)
這題太神了!但是聽說是單純形法求解線性規劃裸題???看樣子網路流和線性規劃有著莫大的聯絡啊,待研究。 此題基本就是用網路流求解了一個等式的最優解? 附上大神題解:https://www.byvoid
bzoj1061 [Noi2008]志願者招募(網路流解決線性規劃問題)
bzoj1061 [Noi2008]志願者招募 題意: 一個專案需要N 天才能完成,其中第i 天至少需要Ai 個人。一共有M 類志願者可以招募。其中第i 類可以從第Si 天工作到第Ti 天,招募
[BZOJ1061][NOI2008]志願者招募(費用流神題單純形裸題)
題目描述 傳送門 題解 關於費用流的神建圖我無言以對。 轉自神犇的部落格:https://www.byvoid.com/blog/noi-2008-employee/ 關於單純形。。。裸題
【BZOJ 1061】 1061: [Noi2008]志願者招募 (線性規劃與網路流)**
1061: [Noi2008]志願者招募 Description 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了一個難 題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要N 天才能完成,其中第i 天至少需要 Ai 個人。 布布通過了解得知
[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+...
[Noi2008]志願者招募(BZOJ1061)
相關連結: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 題目大意: 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了一個難 題:為即將啟動的奧運新專案招募一批短期志願
BZOJ1061: [Noi2008]志願者招募 && 單純形學習筆記
題目 題解 終於搞完了單純形,還真不是個簡單的東西,但是理解之後,演算法挺簡單的,證明只有自動略過了qwq。 學習單純形推薦算導29章,嚴密又不失詳細。 標準的線性規劃式子是,A=(aij),b=(bi),c=(ci),x=(xi) 大小的話A
1061 志願者招募 (利用網路流流量平衡進行等式建模)
1061: [Noi2008]志願者招募 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 5862 Solved: 3529 [Submit][Status][Discuss] Description 申奧成功
NOI 2008 志願者招募(最小費用流)
神奇的費用流……可以看這個https://www.byvoid.com/blog/noi-2008-employee/#more-916,大概就是列出等式,利用網路流流量平衡的條件保證等式相等,然後用費用流就可以算出最小的費用。感覺又學到了新技能。。。用了早
刷題總結——支線劇情(bzoj3876費用流)
inpu 代碼 電視劇 pac ring 新的遊戲 mat tar algorithm 題目: 【故事背景】 宅男JYY非常喜歡玩RPG遊戲,比如仙劍,軒轅劍等等。不過JYY喜歡的並不是戰鬥場景,而是類似電視劇一般的充滿恩怨情仇的劇情。這些遊戲往往 都有很多的支線劇情,現在
【BZOJ3638】Cf172 k-Maximum Subsequence Sum 線段樹區間合並(模擬費用流)
font uil sin upper sample dex else name etc 【BZOJ3638】Cf172 k-Maximum Subsequence Sum Description 給一列數,要求支持操作: 1.修改某個數的值 2.讀入l,r,k,詢問
【BZOJ3502/2288】PA2012 Tanie linie/【POJ Challenge】生日禮物 堆+鏈表(模擬費用流)
line make 前驅 string urn return namespace 禮物 iostream 【BZOJ3502】PA2012 Tanie linie Description n個數字,求不相交的總和最大的最多k個連續子序列。 1<= k<
線性規劃費用流解法(Bzoj1061: [Noi2008]誌願者招募)
UC ++ 求解 oid const mem IV memset cpp 題面 傳送門 Sol 線性規劃費用流解法用與求解未知數為非負數的問題 這道題可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我們強行給每個式子減去一個東西,
[BZOJ]4842: [Neerc2016]Delight for a Cat 1061: [Noi2008]志願者招募 費用流 線性規劃
題解: 把這兩道題目放在一起寫,因為做法是一樣的。 兩題都是經典的線性規劃問題,但同時也都可以用費用流解決。 以志願者招募這題為例,首先設第 i
[NOI 2008]志願者招募(費用流)
【題目描述】: 一共有n天,每天需要a[i]個人,一共有m類志願者,每類有無限個,可以從s[i]服務到t[i],需要花費c[i]的費用。問要滿足要求,最小的費用。 【題目分析】: 這題有一個經典的也很奇妙的構圖法:利用不等式構圖~這個我不懂,想看的話請到byvoid神牛的bl
洛谷 P3980 [NOI2008]志願者招募 費用流
題目描述 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了一個難題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要N 天才能完成,其中第i 天至少需要Ai 個人。 布布通過了解得知,一共有M 類志願者
誌願者招募 HYSBZ - 1061(公式建圖費用流)
找到 bitset size eof 除了 分享圖片 rep 資源 trie 轉自神犇:https://www.cnblogs.com/jianglangcaijin/p/3799759.html 題意:申奧成功後,布布經過不懈努力,終於 成為奧組委下屬公司人力資源部門的主
[NOI2008]志願者招募,洛谷P3980,線性規劃對偶定理以及整數解
正題 題目連結 這一題很容易構造一個線性規劃的模型。 對於每一天,在這一天的志願者的總和大於等於需要的人數,最小化每種志願者乘其單價費用的和。  
【BZOJ1061】[Noi2008]志願者招募【單純形法】
雙倍經驗題,BZOJ3265。 先用對偶原則轉換成求對偶問題的解,這樣直接轉化成了標準型,然後跑Simplex就好了。 下面是對樣例的一個計算過程。 /* Footprints In The