題目描述
題解
一開始按照修車那題的思路搞了個費用流,就是把廚師拆成tim個點,表示他是倒數第幾個做的,然後邊權就是對後面的人的代價和,然後t到飛起。
原因是直接把圖建出來導致圖的規模過大,然後spfa就死了。
所以我們可以動態加邊,每增廣一次就加乙個點。
**
#include#include#include
#include
#define n 49
#define m 109
#define p 809
#define r register
using
namespace
std;
queue
q;int p[n],head[m*p],tot=1,dis[m*p],pre[m*p],fl[m*p],ans,n,m,sum,a[n][m],tim[m*p],id[m],be[m*p];
bool vis[m*p];
inline
intrd()
while(isdigit(c))
return f?-x:x;
} struct edgee[n*m*p*2
];inline
void add(int u,int v,int l,int
f)inline
bool spfa(int s,int
t) }} }
return dis[t]!=0x3f3f3f3f;}
inline
void calc(int s,int
t) ans+=dis[t]*fl[t];
}int
main()
for(r int i=1;i<=n;++i)for(r int j=1;j<=m;++j)add(i,id[j],1
,a[i][j]);
for(r int i=1;i<=m;++i)add(id[i],now+1,1,0
);
for(r int i=1;i<=n;++i)add(0,i,p[i],0
);
while(spfa(0,now+1
)) cout
}
NOI2012 美食節(網路流)
本題是修車的資料加強版 有數量限制和花費,考慮費用流建模 顯然,源點連線每個菜,流量為 p i 廚師連向匯點,流量為 inf 但是菜 i 和廚師 j 在不同時間的花費是不同的,具體來說,當它是倒數第 k 道菜時,它的花費為 k times a 將廚師拆點,分別對應倒數第 k 道菜,連線菜和廚師,流量...
NOI2012 美食節(費用流 動態開點)
題解 費用流 首先確定 每一單位的流量代表一位廚師做乙份菜品,費用代表花費的時間 每位廚師做同一道菜,每乙份時間也是不同的,因此將每個廚師拆成p個點 建邊需要確定的費用與做菜順序有關,而後做的菜對先做的菜是沒有影響的,所以倒著處理,拆成的第i個點表示每位廚師做的倒數第i道菜 建圖 s n種菜品 容量...
NOI2012 美食節 動態加邊維護費用流
現在有 n 種人,每種人有pi 個,還有 m 個廚師,第 j個廚師給第 i 種人做菜需要時間ti j,並且同一時間乙個廚師只能做一道菜。每個人的權值是這個人等待的時間。問所有人的權值和最小是多少。n 40 m 100 p i 800 設s um pi。我們考慮用網路流做這題,我們把第 i 個廚師差拆...