題目描述
尼克在一家養豬場工作,這家養豬場共有m間鎖起來的豬舍,由於豬舍的鑰匙都給了客戶,所以尼克沒有辦法開啟這些豬舍,客戶們從早上開始乙個接乙個來購買生豬,他們到達後首先用手中的鑰匙開啟他所能開啟的全部豬舍,然後從中選取他要買的生豬,尼克可以在此期間將開啟的豬舍中的豬調整到其它開著的豬舍中,每個豬舍能存放的豬的數量是沒有任何限制的。買完豬後客戶會將他開啟的豬舍關上。
好在尼克事先知道每位客戶手中有哪些鑰匙,要買多少豬,以及客戶到來的先後次序。請你寫乙個程式,幫助尼克求出最多能賣出多少頭生豬。
輸入格式
輸入檔案的第一行包含兩個整數m和n,1≤m≤1000,1≤n≤100,m為豬舍的數量,n為客戶人數,豬舍的編號為1到m,客戶的編號為1到n。
輸入檔案第二行包含m個空格隔開的整數,依次表示每個豬舍中的生豬數量,每個整數大於等於0,且小於等於1000。
接下來的n行每行表示一位客戶的購買資訊,第i個客戶的購買資訊位於第i+2行,
其格式如下:
a k1 k2……ka b
它表示該客戶共有a把鑰匙,鑰匙編號依次為k1 k2……ka,且k1< k2<……< ka,b為該客戶要買的生豬的頭數。
輸出格式
輸出檔案僅有一行包含乙個整數,表示尼克最多能賣出的生豬的頭數。
經典的網路流問題。
我們先想一想,豬的流動。總體流動方向是從豬圈流到客戶手中,所以我們可以建立乙個超級源點s,並連線s到所有豬圈的邊,容量為豬圈初始豬的數量;建立乙個超級匯點t,並連線所有客戶到t的邊,容量為客戶希望買到的豬的數量。
繼續思考,每乙個客戶開啟豬圈後,這些豬可以亂跑,所以下一位客戶只要在上乙個客戶開啟的豬圈裡任意開啟乙個,就可以買到上一位客戶開啟的豬圈裡所有的豬。
所以我們可以 繼續連邊:對於任意乙個豬圈,向第乙個開啟它的客戶連一條inf的邊,對於任意乙個豬圈,每乙個客戶都向緊接著開啟該豬圈的下乙個客戶連一條inf的邊。
這樣做一遍dinic最大流就行了。
陣列越界果然什麼都會出來。我因為陣列越界,先wa後tle。。
#include
using
namespace
std;
inline
int read()
namespace grapha[(maxn+maxm+maxm*maxm)<<1];
int head[maxm],top=0,m,n;
void insert(int x,int y,int v)
int pre[maxm],s,t;
void init()//源點向所有豬圈連邊
for(int i=1;i<=n;i++)
int want=read();
insert(i+m,t,want);
insert(t,i+m,0);
//客戶向匯點連邊 }}
}using
namespace graph;
namespace max_flow
}return
false;
}int dfs(int x,int flow)
}return
0; }
}using
namespace max_flow;
int main()
printf("%d\n",ans);
return
0;}
POJ1149 PIGS 最大流 優化建模
pigs 題目大意 有 m m 個豬圈,每個豬圈內有一些豬,有 n role presentation style position relative n n名顧客陸續到來,他們每個人能夠開乙個集合內的豬圈,並且能從這些豬圈中買走至多bi b i頭豬,在這個時候,我們還能對這些豬圈內的豬進行調動,每...
PIGS POJ 1149 水最大流
題意 有m個豬圈,每個豬圈裡初始時有若干頭豬。一開始所有豬圈都是關閉的。依次來了n個顧客,每個顧客分別會開啟指定的幾個豬圈,從中買若干頭豬。每個顧客分別都有他能夠買的數量的上限。每個顧客走後,他開啟的那些豬圈中的豬,都可以被任意地調換到其它開著的豬圈裡,然後所有豬圈重新關上。問總共最多能賣出多少頭豬...
POJ 1149 PIGS 用了三種求最大流的方法
第一道最大流,寫的有點挫,按照ford演算法來做 也沒用什麼改進的最短增廣演算法 轉化為網路流的模型時稍微有點麻煩 include include include include using namespace std define maxn 1005 define inf 9999999 defi...