洛谷P1251 網路流24題 餐巾計畫問題

2021-08-13 15:27:03 字數 1476 閱讀 3736

這題用zkw是真的快……洛谷原先是卡了普通費用流的……但是現在時間到4s了,又有o2和高效能,貌似普通的費用流也可以過了,首先,要把每一天和源點匯點建一條容量為每天的需求的邊,費用為0,然後在條件滿足的情況下(i + n < num of days之類的),向快洗之後那天建容量inf費用f的邊,慢洗也是,注意要和下一天建邊,容量inf費用0,因為可以不洗……所以還是要拆點,至於新買的,自然費用為price,容量inf,總結一下:

1、從source向每個xi連一條容量為ri,費用為0的有向邊

2、從每個yi向sink連一條容量為ri,費用為0的有向邊

3、從source向每個yi連一條容量為inf,費用為p的有向邊

4、從每個xi向xi+1(i+1<=day)連一條容量為inf,費用為0的有向邊(有餐巾會留到明天)

5、從每個xi向yi+m(i+m<=day)連一條容量為inf,費用為f的有向邊

6、從每個xi向yi+n(i+n<=day)連一條容量為inf,費用為s的有向邊

#include #include #include #include #include #include #include using namespace std;

int cnt=1,nd,price,m,f,n,s,ans;

bool inq[2005];

const int inf = 0x3f3f3f3f;

const int maxn = 80003;

const int maxe = 160003;

struct edge

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

}e[maxe];

int h[maxn], p;

int source, sink;

int cur[maxn];

int d[maxn];

queueq;

bool exist[maxn];

inline void add_edge(int x, int y, int cap, int cost)

bool spfa() }}

}return d[sink] != inf;

}long long mcmf()

cost += flow * d[sink];

}return cost;

}int main()

scanf("%d%d%d%d%d", &price, &m, &f, &n, &s);

for(int i = 1; i <= nd; i++)

printf("%d\n",mcmf());

return 0;

}

洛谷 P1251 餐巾計畫問題 (網路流24題)

題目 餐巾計畫問題 思路 拆點,每天拆成收到乾淨餐巾和送出髒餐巾兩部分。把源點和送餐巾的點連邊,收到餐巾的點和匯點連邊,皆是流量w,費用f。把每一天收到餐巾和送出餐巾年連邊,流量inf,費用0。再按照洗和買的條件連邊。跑費用流即可。include using namespace std define...

洛谷 P1251 餐巾計畫問題

吃什麼 先說建圖 經典構圖題。將每一天拆成兩個點i,i 加如下6條邊 s i,r i,p 在第 i 天可以買至多ri 個餐巾,每塊 p 分 i t,r i,0 第i 天要用ri 塊餐巾 s i ri,0 第 i 天用剩的ri 塊舊餐巾 i i m,f 第 i 天的舊餐巾送到快洗部,每塊 f分 i i...

洛谷 P1251餐巾計畫問題 題解

傳送門 乙個餐廳在相繼的 n 天裡,每天需用的餐巾數不盡相同。假設第 i 天需要 r i 塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為 p 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 n 天 n m 其費用為 s 分 s 每天結束時,餐...