bzoj1834: [ZJOI2010]network 网络扩容
来源:互联网 发布:欢乐斗牛捕鱼算法 编辑:程序博客网 时间:2024/05/17 08:39
题目传送门点我
**
Description
**
给定一张有向图,每条边都有一个容量C和一个扩容费用W。这里扩容费用是指将容量扩大1所需的费用。求: 1、 在不扩容的情况下,1到N的最大流; 2、 将1到N的最大流增加K所需的最小扩容费用。
**
Input
**
输入文件的第一行包含三个整数N,M,K,表示有向图的点数、边数以及所需要增加的流量。 接下来的M行每行包含四个整数u,v,C,W,表示一条从u到v,容量为C,扩容费用为W的边。
**
Output
**
输出文件一行包含两个整数,分别表示问题1和问题2的答案。
**
Sample Input
**
5 8 21 2 5 82 5 9 95 1 6 25 1 1 81 2 8 72 5 4 91 2 1 11 4 2 1
**
Sample Output
**
13 1930%的数据中,N<=100100%的数据中,N<=1000,M<=5000,K<=10
**
HINT
**
**
Source
**
Day1
**
Solution
**
调了好久QAQ……脑残了……
第一问就是求最大流 直接套最大流模板
然后考虑一下第二问“把最大流扩大k”
我的思路是这样完善的:(神犇们不要喷我…)
枚举每一条边?额……瞬间秒掉这种思想QAQ
==》
最小费用诶…觉得很像最小费用问题呢…(沉思一会…)貌似就是一个最小费用问题QAQ…但是最大流怎么限制呢?
==》
再加一个原点和1连一条容量为k的边不就好了!
bingo~
然后我很213的调了半天……最后发现了一个很213的错误QAQ
**
Code
**
#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int maxn=1010,maxm=5010,inf=2000000000;struct data{int to,from,next,v,c;}e[maxm*4];int n,m,k,ans,maxflow,q[maxn],head[maxn],inq[maxn],from[maxn],dis[maxn],h[maxn],cnt=1;void ins(int u,int v,int w,int c){ cnt++; e[cnt].to=v;e[cnt].from=u; e[cnt].next=head[u];head[u]=cnt; e[cnt].v=w;e[cnt].c=c;}void insert(int u,int v,int w,int c){ ins(u,v,w,c);ins(v,u,0,-c);}bool bfs(){ int t=0,w=1; memset(h,-1,sizeof(h)); q[0]=1;h[1]=0; while(t<w) { int x=q[t++];if(t==maxn)t=0; for(int i=head[x];i;i=e[i].next) if(e[i].c==0&&e[i].v&&h[e[i].to]<0) { q[w++]=e[i].to;if(w==maxn)w=0; h[e[i].to]=h[x]+1; } } return h[n]!=-1;}int dfs(int x,int f){ if(x==n)return f; int w,used=0; for(int i=head[x];i;i=e[i].next) if(e[i].c==0&&e[i].v&&h[e[i].to]==h[x]+1) { w=dfs(e[i].to,min(f-used,e[i].v)); e[i].v-=w;e[i^1].v+=w; used+=w; if(used==f)return f; } if(!used)h[x]=-1; return used;}void dinic(){ while(bfs()) maxflow+=dfs(1,inf);}bool spfa(){ int t=0,w=1; for(int i=1;i<=n;i++)dis[i]=inf; inq[0]=1;q[0]=0;dis[0]=0; while(t<w) { int x=q[t++];if(t==maxn)t=0; for(int i=head[x];i;i=e[i].next) if(e[i].v>0&&dis[x]+e[i].c<dis[e[i].to]) { dis[e[i].to]=dis[x]+e[i].c; from[e[i].to]=i; if(!inq[e[i].to]) { inq[e[i].to]=1;q[w++]=e[i].to;if(w==maxn)w=0; } } inq[x]=0; } return dis[n]!=inf;}void mcf(){ int x=inf; for(int i=from[n];i;i=from[e[i].from]) x=min(x,e[i].v); for(int i=from[n];i;i=from[e[i].from]) { e[i].v-=x;e[i^1].v+=x; ans+=x*e[i].c; }}int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=1 ; i<=m; i++) { int u,v,c,w; scanf("%d%d%d%d",&u,&v,&c,&w); insert(u,v,c,0); insert(u,v,inf,w); } dinic(); printf("%d",maxflow); ins(0,1,k,0); ins(1,0,maxflow,0); while(spfa())mcf(); printf(" %d",ans); return 0; }/*5 8 21 2 5 82 5 9 95 1 6 25 1 1 81 2 8 72 5 4 91 2 1 11 4 2 1*/
——既然选择了远方,便只顾风雨兼程
0 0
- [BZOJ1834][ZJOI2010]network 网络扩容
- bzoj1834: [ZJOI2010]network 网络扩容
- bzoj1834 [ZJOI2010]network 网络扩容
- 【bzoj1834】[ZJOI2010]network 网络扩容
- BZOJ1834: [ZJOI2010]network 网络扩容
- BZOJ1834: [ZJOI2010]network 网络扩容
- [bzoj1834][ZJOI2010]network 网络扩容
- 【bzoj1834】[ZJOI2010]network 网络扩容
- bzoj1834: [ZJOI2010]network 网络扩容
- 【bzoj1834】[ZJOI2010]network 网络扩容
- 【bzoj1834】 network 网络扩容 【ZJOI2010】
- BZOJ1834: [ZJOI2010]network 网络扩容
- BZOJ1834 [ZJOI2010]network 网络扩容
- 【bzoj1834】[ZJOI2010]network 网络扩容(wikioi1362)
- 【bzoj1834】[ZJOI2010]network 网络扩容 费用流
- bzoj1834[ZJOI2010]network 网络扩容【最大流+费用流】
- [BZOJ1834][ZJOI2010]network 网络扩容(isap+费用流)
- bzoj1834: [ZJOI2010]network 网络扩容(最小费用最大流)
- CSS3 box-shadow
- winpython, anaconda 哪个更好?
- 数组排序(冒泡,比较,插入,快速)
- do...while(0)在宏定义中的巧妙用法
- MongoDB小结18 - find【查询条件$not】
- bzoj1834: [ZJOI2010]network 网络扩容
- 版本信息获取类
- android控件的绘制过程
- Intel Threading Building Blocks 编程指南:异常与终止
- linux
- 字符串加解密
- Android中调用c函数来打印log---(JNI)
- 【Python】Python的数据分析(三)——数据文件及数据结构
- 分享5个实用的Web界面开发框架