bzoj 3280 小R的煩惱

2021-09-22 14:01:54 字數 1281 閱讀 3830

題意:n天,m個學校,k個醫院。每天需要a[i]個人,這a[i]個人工作後處於瀕死狀態,你可以選擇把瀕死狀態的人送去醫院,治好後還可以繼續工作。每個醫院i救治乙個人需要d[i]天,費用q[i]元。學校 i 中乙個人工作一天薪酬為p[ i ].

思路:時間為乙個天然序,第i天的決策為從健康的人中選擇a[i]個人。並且這a[i]個人變為瀕死的人。流量可以理解為決策的選擇。

那麼節點就需要設定為每天健康的人數和瀕死的人數。節點狀態確定後建圖就很容易了

坑點:假設醫院a救治乙個人需要1天,第一天送去醫院的人第三天才能使用,不是第二天。

#include using namespace std;

typedef long long ll;

const ll inf = 0x3f3f3f3f3f3f3f3f;

const ll maxn = 2000000;

const ll maxm = 2000000;

struct mcmf

void add(ll x,ll y,ll cap,ll c)

bool spfa(ll s,ll t)

d[s] = 0;

vis[s] = true;

q.push(s);

while(!q.empty())}}

}if(pre[t] == -1)return false;

else return true;

}ll mincost(ll s,ll t,ll &cc)

for(ll cure = pre[t];cure != -1;cure = pre[ ver[cure^1] ])

flow += mn;

}return flow;

}} g;

ll a[100],l[100],p[100],q[100],d[100];

int main()

for( ll i = 1;i <= m;i++ )

for( ll i = 1;i <= k;i++ )

for( ll i = 1;i <= m;i++ )

for( ll i = 1;i < n;i++ )

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

for( ll i = 1; i <= n;i++ )

ll maxflow = g.mincost( ss,tt,cost );

printf("case %lld: ",ca);

if( maxflow != sum )else

}return 0;

}

bzoj3280 小R的煩惱

description 小r最近遇上了 煩,他的程式設計掛科了。於是他只好找程設老師求情。善良的程設老師答應不掛他,但是要求小r幫助他一起解決乙個難題。問題是這樣的,程設老師最近要進行一項 的實驗來證明p np,這個實驗一共持續n天,第i天需要a i 個研究生來給他搬磚。研究生畢竟也是人,所以僱傭研...

小R的煩惱 BZOJ3280

分析 一開始一直wa,發現是建圖建錯了,必須得拆點。s連i,流量為a i 費用為0,i n連t,流量同上,費用為0,之後i連i 1費用為0,流量為inf,之後s連n 2 i,流量為li,費用為0,之後列舉j從1到n,n 2 i連線j n,費用為p i 之後i連線i d i 1,費用為q i 流量為i...

bzoj3280 小R的煩惱(費用流)

題目傳送門 解法 一開始yy了個建圖。完全沒毛病。結果不知道怎麼判impossible了。很尷尬。每天分成兩個點。乙個點x表示今天收到多少個活人。乙個點y表示多少個瀕死的人。今天僱的人一定會用。所以變成死人。大學連y,容量無限費用q i 每天最多a i 個死人。st連y容量a i 費用0 每天最多a...