您的位置:首页 > 其它

BZOJ 1391: [Ceoi2008]order [最小割]

2017-01-06 20:50 447 查看

1391: [Ceoi2008]order

Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1509 Solved: 460
[Submit][Status][Discuss]

Description

有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成。 现在给出这些参数,求最大利润

Input

第一行给出 N,M(1<=N<=1200,1<=M<=1200) 下面将有N块数据,每块数据第一行给出完成这个任务能赚到的钱(其在[1,5000])及有多少道工序 接下来若干行每行两个数,分别描述完成工序所需要的机器编号及租用它的费用(其在[1,20000]) 最后M行,每行给出购买机器的费用(其在[1,20000])

Output

最大利润

Sample Input

2 3

100 2

1 30

2 20

100 2

1 40

3 80

50

80

110

Sample Output

50

我靠这不最小割裸题
收益,租用,买机器,必须放弃其中之一
s--收益-->任务--租金-->机器--价钱-->t
然后求最小割,再用总收益减就可以了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=2405,M=2e6+5,INF=1e9;
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
return x*f;
}

int m,n,s,t,x,w,c,ans;
struct edge{
int v,c,f,ne;
}e[M<<1];
int cnt,h
;
inline void ins(int u,int v,int c){
cnt++;
e[cnt].v=v;e[cnt].c=c;e[cnt].f=0;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].c=0;e[cnt].f=0;e[cnt].ne=h[v];h[v]=cnt;
}
int q
,head,tail,vis
,d
;
bool bfs(){
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
head=tail=1;
d[s]=0;vis[s]=1;
q[tail++]=s;
while(head!=tail){
int u=q[head++];
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(!vis[v]&&e[i].c>e[i].f){
vis[v]=1;
d[v]=d[u]+1;
q[tail++]=v;
if(v==t) return true;
}
}
}
return false;
}
int cur
;
int dfs(int u,int a){
if(u==t||a==0) return a;
int flow=0,f;
for(int &i=cur[u];i;i=e[i].ne){
int v=e[i].v;
if(d[v]==d[u]+1&&(f=dfs(v,min(a,e[i].c-e[i].f)))>0){
flow+=f;
e[i].f+=f;
e[((i-1)^1)+1].f-=f;
a-=f;
if(a==0) break;
}
}
return flow;
}
int dinic(){
int flow=0;
while(bfs()){
for(int i=s;i<=t;i++) cur[i]=h[i];
flow+=dfs(s,INF);
}
return flow;
}
int main(){
//freopen("in.txt","r",stdin);
n=read();m=read();s=0;t=n+m+1;
for(int i=1;i<=n;i++){
w=read();c=read();ans+=w;
ins(s,i,w);
while(c--) x=read(),w=read(),ins(i,n+x,w);
}
for(int i=1;i<=m;i++) w=read(),ins(n+i,t,w);
printf("%d",ans-dinic());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: