題意:有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種菜品 容量...