題目大意:
有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個羊肉串可以被分開來考,乙個單獨的羊肉串也能分開...