餐巾計畫問題 網路流24題 最大流最小費用

2021-09-13 11:20:28 字數 1511 閱讀 3558

一道普通的最大流最小費用的題,我們需要考慮的是這樣的情況:第i天的舊餐巾我們該怎麼處理?我們知道可以退後m天去快洗,然後在第i+m天再次使用它花費f元,另外的方法就是在推後n天去慢洗,花費的s元,但是我們要是遇到剛好那天在這段區間內的怎麼辦,我們不如就加上一組無條件推後一天的情況。

那麼,我們可以這麼去建邊,從源點開始,連上一天流量為當天使用的舊餐巾的數目的邊,再連上一天流量為inf的到定義的新餐巾的邊其需要的錢是p(買乙個新餐巾的價錢),然後,我們知道有「推遲一天」、「快洗m天」、「慢洗n天」這樣的情況,我們就由舊餐巾連向x天後的對應的新餐巾,然後由新餐巾向匯點連線上對應的每天需要的餐巾的數目。

#include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) ( x&(-x) )

#define pi 3.141592653589793

#define e 2.718281828459045

#define inf 0x3f3f3f3f

#define half (l + r)>>1

#define lsn rt<<1

#define rsn rt<<1|1

#define lson lsn, l, mid

#define rson rsn, mid+1, r

#define ql lson, ql, qr

#define qr rson, ql, qr

#define myself rt, l, r

using namespace std;

typedef unsigned long long ull;

typedef long long ll;

const int maxe = 1.2e4 + 7, maxn = 6007, s = 0;

int n, p, m, f, n, s, head[maxn], cnt, pre[maxn], r[maxn], t, flow[maxn];

ll dist[maxn];

bool inque[maxn];

struct eddge

}edge[maxe<<1];

inline void addeddge(int u, int v, int flow, int cost)

queueq;

bool spfa()}}

}return pre[t] ^ -1;

}ll out_put()

ans += (ll)flow[t] * dist[t];

}return ans;

}inline void init()

int main()

if(i + m <= n) //快洗

if(i + n <= n)

}printf("%lld\n", out_put());

return 0;

}

網路流24題 餐巾計畫問題

傳送門 這個題我一開始沒把tot賦值成 1,然後調了1h。然後只拿了20,看了題解才知道漏了一種情況,那就是其實餐巾是可以留到第二天的。然後就沒了。對了,忘說做法了 尷尬 其實就是拆點,分別連邊,實現題目中的三種操作,具體可以看我的 include include include include i...

網路流24題餐巾計畫問題

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

網路流24題 餐巾計畫問題

一道建模稍微有難度的網路流,首先你需要考慮到拆點,確實有點難度,你需要把一天拆成乾淨餐巾和骯髒餐巾,因為髒餐巾是可以轉化為乾淨餐巾的,你需要做到這個過程,所以你需要拆點,其次難想到的應該是如何解決快洗部和慢洗部每次只能洗一件並且需要洗多天,如何安排哪天的餐巾去洗就是個問題,所以可以考慮每天的餐巾都可...