HDU 2883 kebab 離散化 最大流

2021-08-06 07:22:52 字數 1751 閱讀 7185

hdu 2883 kebab(離散化+最大流)

題意

:

給定n個顧客,第i號顧客在si到達,點了ni個羊肉串,每個羊肉串需要ti個時間烤好。顧客想要在ei得到,乙個烤爐只烤m串。問你是否能滿足所有顧客的要求?能的話輸出「yes」,否則輸出「no」。

注意:這ni個羊肉串可以被分開來考,乙個單獨的羊肉串也能分開烤(比如乙個單獨的羊肉串需要ti時間,我們把它分成ti份同時烤的話,那麼乙個羊肉串可以在1個單位時間內拷完)

注意

:每個顧客的任務必須在

(si,ei]

半開半閉的區間內完成

.

分析

:

本題與hdu3572有點類似:

其實本題的本質就是hdu3572的思想,每個顧客其實提出的是需要ni*ti個單位時間任務(甚至可以在

1個時刻同時完成

,因為一串羊肉串都可以在

1個時刻烤完),但是你每個時間只能提供m個單位時間做任務. 但是這個題目的時間點覆蓋1到100w,明顯不能再把每個單獨的時間看成乙個點了,所以這題要把每個不重疊的子時間區間看成乙個點.

首先讀入所有任務的開始時間s[i]和結束時間e[i],然後對這些時間點排序,去重,得到cnt個時間點,然後我們就能得到cnt-1個半開半閉的子時間區間(前後兩個子區間邊界不重疊

,且所有區間連起來正好覆蓋了原來的整個大時間區間

,該大時間區間也是半開

,半閉的).

建圖: 源點s編號0,  n個任務編號1到n,  cnt-1個區間編號n+1到n+cnt,  匯點t編號n+cnt+1.

源點到每個任務i有邊(s,i,ni*ti)

每個時間區間j到匯點有邊(j,t, 該區間覆蓋的單位時間點數)

如果任務i包含時間區間j,那麼有邊(i,j,inf)

求最大流,看最大流 是否== 所有任務需要的單位時間之和即可.

ac**:

#include#include#include#include#define inf 1e9

using namespace std;

const int maxn=700;//之前這裡只寫10+5,一直tle,真是悲劇

struct edge

edge(int from,int to,int cap,int flow):from(from),to(to),cap(cap),flow(flow){}

int from,to,cap,flow;

//cap是容量 flow是流量

};struct dinic

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

bool bfs()}}

return vis[t];//表示能否到大t點 不能的話返回false

}int dfs(int x,int a)

}return flow;

}int maxflow()

return flow;

}}dc;

int num[maxn],s[maxn],e[maxn],t[maxn];

int a[maxn<<1];

int main()

sort(a,a+cnt);

cnt=unique(a,a+cnt)-a;

for(int i=1;i

hdu2883 kebab (最大流 離散化)

題目大意 你在經營乙個烤肉店,給你n個客人,每個客人都要求有ni的肉串,並且不要客人要求的肉串的一串烤製時間是不一樣的 為ti 客人將在si到,並且在ei的時候走。你有乙個烤肉機,每天可以烤製m個串,並且每個串是可以分不連續的幾天烤製。題解 從資料規模和模型很容易看出來是一道網路流的題目,hdu上還...

HDU 2883 kebab 最大流建模

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

HDU 2883 kebab 最大流,滿流

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