[CEOI2008] order
生活随笔
收集整理的這篇文章主要介紹了
[CEOI2008] order
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
有N個工作,M種機器,每種機器你可以租或者買過來. 每個工作包括若干道工序,每道工序需要某種機器來完成,你可以通過購買或租用機器來完成。 現在給出這些參數,求最大利潤
輸入輸出格式
輸入格式:
?
第一行給出 N,M(1<=N<=1200,1<=M<=1200) 下面將有N組數據。
每組數據第一行給出完成這個任務能賺到的錢(其在[1,5000])及有多少道工序
接下來若干行每行兩個數,分別描述完成工序所需要的機器編號及租用它的費用(其在[1,20000]) 最后M行,每行給出購買機器的費用(其在[1,20000])
?
輸出格式:
?
最大利潤
?
輸入輸出樣例
輸入樣例#1:?2 3 100 2 1 30 2 20 100 2 1 40 3 80 50 80 110 輸出樣例#1:?
50
經典最小割建模。
#include<bits/stdc++.h> #define ll long long #define pb push_back const int maxn=3005; using namespace std; const int inf=1<<30; vector<int> g[maxn]; struct lines{int to,flow,cap; }l[maxn*1000]; int S,T,t=-1,d[maxn],cur[maxn]; bool v[maxn];inline void add(int from,int to,int cap){l[++t]=(lines){to,0,cap},g[from].pb(t);l[++t]=(lines){from,0,0},g[to].pb(t); }inline bool BFS(){memset(v,0,sizeof(v));queue<int> q;q.push(S),v[S]=1,d[S]=0;int x; lines e;while(!q.empty()){x=q.front(),q.pop();for(int i=g[x].size()-1;i>=0;i--){e=l[g[x][i]];if(e.flow<e.cap&&!v[e.to]){v[e.to]=1,d[e.to]=d[x]+1;q.push(e.to);}}}return v[T]; }int dfs(int x,int A){if(!A||x==T) return A;int flow=0,f,sz=g[x].size();for(int &i=cur[x];i<sz;i++){lines &e=l[g[x][i]];if(d[e.to]==d[x]+1&&(f=dfs(e.to,min(A,e.cap-e.flow)))){A-=f,flow+=f;e.flow+=f,l[g[x][i]^1].flow-=f;if(!A) break;}}return flow; }inline int max_flow(){int an=0;while(BFS()){memset(cur,0,sizeof(cur));an+=dfs(S,inf);}return an; } int N,M,ans=0,now,num,K; int main(){scanf("%d%d",&N,&M),S=0,T=N+M+1;for(int i=1;i<=N;i++){scanf("%d",&now),ans+=now,add(S,i,now);scanf("%d",&K);while(K--){scanf("%d%d",&num,&now);add(i,num+N,now);}}for(int i=1;i<=M;i++) scanf("%d",&now),add(i+N,T,now);printf("%d\n",ans-max_flow());return 0; }
?
轉載于:https://www.cnblogs.com/JYYHH/p/8782620.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的[CEOI2008] order的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css比较特殊选择器汇总(持续更新)
- 下一篇: 前后端分离使用 Token 登录解决方案