NOI2012 美食節 費用流

2022-07-13 20:03:17 字數 1205 閱讀 2729

題目描述

題解

一開始按照修車那題的思路搞了個費用流,就是把廚師拆成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 個廚師差拆...