BZOJ 3280 费用流
思路:
同BZOJ 1221
//By SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
#define N 666666
#define inf 0x3f3f3f3f
int cases,n,m,k,ed,cost[N],edge[N],next[N],first[6666],v[N],tot,a[666],l[666],p[666],d[666],q[666];
int vis[6666],with[6666],dis[6666],minn[6666],ans,all,All;
void Add(int x,int y,int C,int E){cost[tot]=C,edge[tot]=E,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void add(int x,int y,int C,int E){Add(x,y,C,E),Add(y,x,-C,0);}
bool tell(){
mem(vis,0),mem(with,0),mem(dis,0x3f),mem(minn,0x3f);
queue<int>q;q.push(0);dis[0]=0;
while(!q.empty()){
int t=q.front();q.pop(),vis[t]=0;
for(int i=first[t];~i;i=next[i])
if(dis[v[i]]>dis[t]+cost[i]&&edge[i]){
dis[v[i]]=dis[t]+cost[i],minn[v[i]]=min(minn[t],edge[i]),with[v[i]]=i;
if(!vis[v[i]])vis[v[i]]=1,q.push(v[i]);
}
}return dis[ed]!=inf;
}
int zeng(){
for(int i=ed;i;i=v[with[i]^1])
edge[with[i]]-=minn[ed],edge[with[i]^1]+=minn[ed];
All+=minn[ed];
return dis[ed]*minn[ed];
}
int main(){
scanf("%d",&cases);
for(int I=1;I<=cases;I++){
mem(first,-1),all=All=ans=tot=0;
scanf("%d%d%d",&n,&m,&k),ed=2*n+1;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++)scanf("%d%d",&l[i],&p[i]);
for(int i=1;i<=k;i++)scanf("%d%d",&d[i],&q[i]);
for(int i=1;i<=n;i++)add(0,i,0,a[i]),add(n+i,ed,0,a[i]),all+=a[i];
for(int i=1;i<=m;i++)add(0,1+n,p[i],l[i]);
for(int i=1;i<n;i++){
add(n+i,n+i+1,0,inf);
for(int j=1;j<=k;j++)if(i+d[j]<n)
add(i,i+d[j]+n+1,q[j],inf);
}
while(tell())ans+=zeng();
printf("Case %d: ",I);
if(all==All)printf("%d\n",ans);
else puts("impossible");
}
}
BZOJ 3280 费用流的更多相关文章
- bzoj 3171 费用流
每个格拆成两个点,出点连能到的点的入点,如果是箭头指向 方向费用就是0,要不就是1,源点连所有出点,所有入点连 汇点,然后费用流 /********************************** ...
- bzoj 1449 费用流
思路:先把没有进行的场次规定双方都为负,对于x胜y负 变为x + 1胜 y - 1 负所需要的代价为 2 * C[ i ] * x - 2 * D[ i ] * y + C[ i ] + D[ i ...
- BZOJ 1061费用流
思路: 我们可以列出几个不等式 用y0带进去变成等式 下-上 可以消好多东西 我们发现 等式左边的加起来=0 可以把每个方程看成一个点 正->负 连边 跑费用流即可 //By SiriusRen ...
- BZOJ 1283 费用流
思路: 最大费用最大流 i->i+1 连边k 费用0 i->i+m (大于n的时候就连到汇) 连边1 费用a[i] //By SiriusRen #include <queue> ...
- bzoj 1070 费用流
//可以网络流,但是要怎么分配每辆车让谁维修以及维修顺序呢.可以考虑每辆车维修时间对总结果的贡献,把每个修车人拆成n个点共n*m个点, //n辆车连向这n*m个点,流量1,费用k*修车时间,其中k(1 ...
- bzoj 2668 费用流
我们可以把初始状态转化为目标状态这一约束转化为将黑子移动到目标状态所需要的最少步数. 除了初始点和目标点之外,剩下的点如果被经过那么就会被交换两次,所以我们将一个点拆成3个点,a,b,c,新建附加源点 ...
- bzoj 2245 费用流
比较裸 源点连人,每个人连自己的工作,工作连汇,然后因为人的费用是 分度的,且是随工作数非降的,所以我们拆边,源点连到每个人s+1条边 容量是每段的件数,费用是愤怒 /**************** ...
- BZOJ 4514 费用流
思路: 懒得写了 http://blog.csdn.net/werkeytom_ftd/article/details/51277482 //By SiriusRen #include <que ...
- [BZOJ 1221] [HNOI2001] 软件开发 【费用流 || 三分】
题目链接:BZOJ - 1221 题目分析 算法一:最小费用最大流 首先这是一道经典的网络流问题.每天建立两个节点,一个 i 表示使用毛巾,一个 i' 表示这天用过的毛巾. 然后 i 向 T 连 Ai ...
随机推荐
- objective-c訪问控制符
objective-c中成员变量的四个訪问控制符: @private:仅仅有当前类的内部才干訪问 @public:全部人都可訪问 @protected:仅仅限当前类和它的子类可以訪问 @package ...
- sqlzoo练习答案--SELECT names/zh
name continent Afghanistan Asia Albania Europe Algeria Africa Andorra Europe Angola Africa .... name ...
- 编写shell脚本获取本机的网络地址。  比方:本机的ip地址是:192.168.100.2/255.255.255.0,那么它的网络地址是 192.168.100.1/255.255.255.
ubuntu@ubuntu:~$ vim getlocalip.sh #!/bin/bash #ifconfig | grep inet | awk '$2' | awk -F : '$2' IP=` ...
- JSP中动态include与静态include的区别介绍
转自:https://m.jb51.net/article/43304.htm 动态INCLUDE 用法:<jsp:include page="included.jsp" f ...
- [雅礼NOIP2018集训 day1]
现在才来填坑,之后还要陆续补其他几天的,可能前几天真的太颓了 T1: 题目大意:给定一个长度为n的序列,m次询问每次询问给出l,r,询问区间l到r的元素在模k意义下的最大值 数据范围当然是你暴力写不过 ...
- Android RecyclerView 设置item间隔的方法
RecyclerView大家常用,但是如何给加载出来的item增加间隔很多人都不知道,下面是方法,直接上代码了: LinearLayoutManager layoutManager = new Lin ...
- div内快元素[div,p。。。]居中办法
方法1: .parent { width:800px; height:500px; border:2px solid #000; position:relative; } .child { width ...
- jQuery获取单选框(复选框)选中的状态
jQuery 获取单选框(复选框)选中的状态 <input type="checkbox" name="" id="choose"/& ...
- React-Router-API中文介绍
React-Router API 以下内容翻译自react-router/doc/API.md,方便使用时查看,之前的学习都是能够工作即可,但一些内在发生的行为并不知晓,借此理解一番: ##Compo ...
- vue项目,封装api并使用
封装api index.js let uploadBase = '' if(process.env.NODE_ENV === 'production'){ uploadBase = 'https:// ...