POJ1149 養豬(最大流)

2021-08-21 10:26:54 字數 1729 閱讀 7129

題目描述

尼克在一家養豬場工作,這家養豬場共有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...