您的位置:首页 > 其它

【BZOJ】【1391】【CEOI2008】order

2015-03-14 22:43 429 查看

网络流/最小割

  暴力建图就好了……S->i 容量为收益,i->j+n 容量为租金,j+n->T容量为购买所花的钱。

  如果亏钱的话那么割掉的就是收益,表示不赚钱。

  如果租金大于购买所花的钱就会割掉购买的钱(因为流量限制住了……)

  表示T到死啊……copy了Hzwer……orz

//BZOJ 2768
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=0,sign=1; char ch=getchar();
while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();}
return v*sign;
}
const int N=2510,M=3000000,INF=~0u>>2;
typedef long long LL;
/******************tamplate*********************/
int n,m,ans;
struct edge{
int to,v;
};
edge E[M];
int head
,next[M],cnt;
void add(int x,int y,int v){
E[++cnt]=(edge){y,v};
next[cnt]=head[x]; head[x]=cnt;
E[++cnt]=(edge){x,0};
next[cnt]=head[y]; head[y]=cnt;
}
int s,t,cur
,d
,Q
;
void init(){
n=getint();m=getint();
cnt=1;ans=0;
s=0; t=n+m+1;
int x,y,a,b;
F(i,1,n){
x=getint(); y=getint();
ans+=x;
add(s,i,x);
F(j,1,y){
a=getint(); b=getint();
add(i,n+a,b);
}
}
F(i,1,m){
x=getint();
add(n+i,t,x);
}
}
bool mklevel(){
F(i,s,t) d[i]=-1;
d[s]=0;
int l=0,r=-1;
Q[++r]=s;
while(l<=r){
int x=Q[l++];
for(int i=head[x];i;i=next[i])
if (d[E[i].to]==-1 && E[i].v){
d[E[i].to]=d[x]+1;
Q[++r]=E[i].to;
}
}
return d[t]!=-1;
}
int dfs(int x,int a){
if (x==t||a==0) return a;
int flow=0;
for(int &i=cur[x];i && flow<a;i=next[i])
if (d[E[i].to]==d[x]+1 && E[i].v){
int f=dfs(E[i].to,min(a-flow,E[i].v));
E[i].v-=f;
E[i^1].v+=f;
flow+=f;
}
if (!flow) d[x]=-1;
return flow;
}
void Dinic(){
while(mklevel()){
F(i,s,t) cur[i]=head[i];
ans-=dfs(s,INF);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("2768.in","r",stdin);
freopen("2768.out","w",stdout);
#endif
init();Dinic();
printf("%d\n",ans);
return 0;
}


View Code(My)

1391: [Ceoi2008]order

Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 746 Solved: 230
[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

HINT



Source

[Submit][Status][Discuss]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: