BZOJ 2879 美食節(費用流 動態加邊)

2021-09-08 20:36:58 字數 793 閱讀 8958

題意:有n道菜,每道菜需要b[i]份,m個廚師,第j個廚師做第i道菜需要時間a[i][j],求做完所有菜,所有人等待的最小總時間。

思路:設所有的菜為sum。乙個明顯的思路是將每個廚師拆成sum個點。然後sum個菜每個菜向每個廚師的每個點連邊,表示該道菜為該廚師第幾個做。由於這樣資料太大。動態加邊。每次增光一次後找到此次增廣的廚師,每道菜將其連邊。

struct node

;node edges[n*5];

int head[n],e;

void add(int u,int v,int cap,int cost)

void add(int u,int v,int cap,int cost)

int pre[n],f[n],c[n],visit[n];

int spfa(int s,int t,int n)}}

}return f[t];

}int s,t,n,m,a[55][105],b[105],cnt[105],last[105];

int main()

}for1(i,m)

int ans=0,temp;

while(sum--)

for(j=1;j<=m&&edges[last[j]-1].cap;j++);

cnt[j]++;

for1(i,n) add(i,n+m+sum,1,a[i][j]*cnt[j]);

add(n+m+sum,t,1,0);

last[j]=e;

}pr(ans);

}

BZOJ2879 美食節(費用流)

bzoj 洛谷一眼就會思路了吧。把每個廚師拆點,拆分為他最多能要做的菜的個數,即 p i pi 然後把每個菜向廚師的每個點連邊,表示這個菜是這個廚師做的第幾個菜。考慮一下這個菜放在這個位置對於後面所有位置的影響就好了。然後跑費用流就好了。經蘿蔔提醒,上面這個東西就是scoi2007修車那道題目 然而...

C 之路高階 bzoj2879(美食節)

time limit 10 sec memory limit 512 mb submit 1304 solved 702 submit status discuss 輸入檔案的第1行包含兩個正整數n和m,表示菜品的種數和廚師的數量。第2行包含n個正整數,其中第i個數為pi,表示點第i種菜品的人數。接...

NOI2012 美食節(費用流 動態開點)

題解 費用流 首先確定 每一單位的流量代表一位廚師做乙份菜品,費用代表花費的時間 每位廚師做同一道菜,每乙份時間也是不同的,因此將每個廚師拆成p個點 建邊需要確定的費用與做菜順序有關,而後做的菜對先做的菜是沒有影響的,所以倒著處理,拆成的第i個點表示每位廚師做的倒數第i道菜 建圖 s n種菜品 容量...