HDU 2883 kebab(最大流判滿流)

2021-07-03 19:00:44 字數 1383 閱讀 9694

題目大意:

有n個人來買烤串,烤串機一次能烤m個烤串,給出每個人到來的時間si,離開的時間ei,每個人買ni個烤串,每個烤串所序的時間為ti,問能否滿足所有顧客的需求;

思路分析:

這道題和hdu的3572很像,只不過這道題的si和ei範圍太大,所以不能採用時間點,而是用時間區間;

①:設立乙個源點,連向每乙個人,權值為ni*ti,表示乙個人所有烤串所需要的時間;

②:把每個人的時間si,ei都存下來,進行排序,然後乙個人的時間區間完全包括乙個相鄰時間點的時間段,就從這個人向這個時間段連一條邊,權值為inf,

③:每乙個時間段連向匯點,權值為((time[i]-time[i-1)*m),表示烤串機一次能烤m個串,這一段時間能烤的烤串的總時間;

跑一遍最大流,當最大流等於所有的總時間,輸出yes,否則是no;

**實現:

#include#include#include#include#include#define max(a,b) ((a)>(b)?(a):(b))

using namespace std;

const int n=610;

const int m=161200;

const int inf=0x3f3f3f3f;

int n,m,s,t,top,head[n],gap[n],cur[n],pre[n],dis[n],time[n],si[n],ei[n];

struct edgeedge[m];

void addedge(int from,int to,int val)

void bfs()}}

}int sap()

}for(int i=s;i!=t;i=edge[cur[i]].to)

max_flow+=cur_flow;

u=neck;

}int i;

for(i=cur[u];i!=-1;i=edge[i].next)

if(edge[i].flow&&dis[u]==dis[edge[i].to]+1) break;

if(i!=-1)else

dis[u]=mindis+1;

gap[dis[u]]++;

if(u!=s) u=pre[u];}}

return max_flow;

}int main()

sort(time,time+cnt);

for(int i=1;i=time[j]) addedge(i,j+n,inf);

int res=sap();

if(res>=sum) printf("yes\n");

else printf("no\n");

}}

HDU 2883 kebab 最大流建模

題意 乙個燒烤攤,最多同時考m個串,現在給n個顧客資訊,分別是到達燒烤店的時間,和他要走的時間,以及需要考的串的個數,和每個串烤熟需要的時間。問給定n個顧客,是否能夠滿足所有顧客的需求。思路從超級源點連邊到每個顧客,容量為ni ti,對於輸入的時間區間,將所有點排序去重,然後每個區間連邊到超級匯點容...

HDU 2883 kebab 最大流,滿流

題意 有乙個人有個烤架,他的烤架同時可以烤m個串,有n個顧客會過來買,si,ni,ei,ti分別表示當前顧客來的開始時間,需要烤串的數量,最晚走的時間,每個烤串需要烤的時間。思路 此題同 hdu 3572,比3572多乙個離散化 s 時間 顧客 t 因為此題時間範圍太大,所以需要離散化,然後時間是乙...

HDU 2883 kebab 離散化 最大流

hdu 2883 kebab 離散化 最大流 題意 給定n個顧客,第i號顧客在si到達,點了ni個羊肉串,每個羊肉串需要ti個時間烤好。顧客想要在ei得到,乙個烤爐只烤m串。問你是否能滿足所有顧客的要求?能的話輸出 yes 否則輸出 no 注意 這ni個羊肉串可以被分開來考,乙個單獨的羊肉串也能分開...