【BZOJ1834】[ZJOI2010]network 网络扩容 最大流+最小费用流
【BZOJ1834】[ZJOI2010]network 网络扩容
Description
Input
Output
Sample Input
1 2 5 8
2 5 9 9
5 1 6 2
5 1 1 8
1 2 8 7
2 5 4 9
1 2 1 1
1 4 2 1
Sample Output
30%的数据中,N<=100
100%的数据中,N<=1000,M<=5000,K<=10
题解:先跑最大流,然后新建一个汇点T,从n向T连一条费用为0,容量为k的边,再在原来的所有边上都新开一条费用为1,容量为∞的边,再跑最小费用流就行了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn=1010;
const int maxm=100000;
int n,m,K,S,T,cnt,sum,ans;
int dis[maxn],to[maxm],next[maxm],head[maxn],cost[maxm],flow[maxm],inq[maxn];
int ea[maxm],eb[maxm],ec[maxm],ed[maxm],re[maxn],rv[maxn];
queue<int> q;
void add(int a,int b,int c,int d)
{
to[cnt]=b,flow[cnt]=c,cost[cnt]=d,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,flow[cnt]=0,cost[cnt]=-d,next[cnt]=head[b],head[b]=cnt++;
}
int bfs()
{
while(!q.empty()) q.pop();
memset(dis,0,sizeof(dis));
int i,u;
dis[S]=1,q.push(1);
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=next[i])
{
if(!dis[to[i]]&&flow[i])
{
dis[to[i]]=dis[u]+1;
if(to[i]==T) return 1;
q.push(to[i]);
}
}
}
return 0;
}
int SPFA()
{
while(!q.empty()) q.pop();
memset(dis,0x3f,sizeof(dis));
int i,u;
dis[S]=0,q.push(S);
while(!q.empty())
{
u=q.front(),q.pop(),inq[u]=0;
for(i=head[u];i!=-1;i=next[i])
{
if(flow[i]&&dis[to[i]]>dis[u]+cost[i])
{
dis[to[i]]=dis[u]+cost[i];
re[to[i]]=i,rv[to[i]]=u;
if(!inq[to[i]])
{
inq[to[i]]=1;
q.push(to[i]);
}
}
}
}
return dis[T]<=(1<<29);
}
int dfs(int x,int mf)
{
if(x==T) return mf;
int temp=mf,i,k;
for(i=head[x];i!=-1;i=next[i])
{
if(dis[to[i]]==dis[x]+1&&flow[i])
{
k=dfs(to[i],min(temp,flow[i]));
if(!k) dis[to[i]]=0;
flow[i]-=k,flow[i^1]+=k,temp-=k;
if(!temp) break;
}
}
return mf-temp;
}
int main()
{
scanf("%d%d%d",&n,&m,&K);
int i;
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&ea[i],&eb[i],&ec[i],&ed[i]);
add(ea[i],eb[i],ec[i],0);
}
S=1,T=n;
while(bfs()) ans+=dfs(S,1<<30);
printf("%d ",ans);
for(i=1;i<=m;i++) add(ea[i],eb[i],1<<30,ed[i]);
add(T,T+1,K,0);
ans=0,T++;
while(SPFA())
{
int minn=1<<30;
for(i=T;i!=1;i=rv[i]) minn=min(minn,flow[re[i]]);
ans+=minn*dis[T];
for(i=T;i!=1;i=rv[i]) flow[re[i]]-=minn,flow[re[i]^1]+=minn;
}
printf("%d\n",ans);
return 0;
}
【BZOJ1834】[ZJOI2010]network 网络扩容 最大流+最小费用流的更多相关文章
- [BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3330 Solved: 1739 [Subm ...
- bzoj1834: [ZJOI2010]network 网络扩容 费用流
bzoj1834 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容 ...
- BZOJ1834 [ZJOI2010]network 网络扩容 【最大流,费用流】
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3394 Solved: 1774 [Subm ...
- BZOJ 1834: [ZJOI2010]network 网络扩容(最大流+最小费用最大流)
第一问直接跑最大流.然后将所有边再加一次,费用为扩容费用,容量为k,再从一个超级源点连一条容量为k,费用为0的边到原源点,从原汇点连一条同样的边到超级汇点,然 后跑最小费用最大流就OK了. ---- ...
- bzoj 1834: [ZJOI2010]network 网络扩容 -- 最大流+费用流
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Description 给定一张有向图,每条边都有一个容量C和一 ...
- 【费用流】bzoj1834: [ZJOI2010]network 网络扩容
还是稍微记一下这个拆点模型吧 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: ...
- 2018.10.13 bzoj1834: [ZJOI2010]network 网络扩容(最大流+费用流)
传送门 网络流水题啊. 第一问直接放心跑最大流(本来还以为有什么tricktricktrick). 第二问就直接把原来的边(u,v,c,w)(u,v,c,w)(u,v,c,w)变成(u,v,c,0)( ...
- 【最大流】【费用流】bzoj1834 [ZJOI2010]network 网络扩容
引用题解: 最大流+费用流. 第一问最大流即可. 第二问为“最小费用最大流”. 由题意,这一问的可转化为在上一问的“残量网络”上,扩大一些边的容量,使能从新的图中的最大流为k. 那么易得:对于还有剩余 ...
- BZOJ1834 [ZJOI2010]network 网络扩容(最小费用最大流)
挺直白的构图..最小费用最大流的定义. #include<cstdio> #include<cstring> #include<queue> #include< ...
随机推荐
- linux大小写转换
[root@ob2 mytmp]# cat aa2.txt|sed 's#[a-z]#\u&#g'ETH0 LINK ENCAP:ETHERNET HWADDR 00:0C:29: ...
- DataGridView使用技巧三:不显示最下面的新行、判断新增行
一.DataGridView不显示下面的新行 通常DataGridView的最下面一行是用户新追加的行(行头显示*).如果不想让用户新追加行即不想显示该新行,可以将DataGridView对象的All ...
- stm32独立看门狗
转载:http://blog.sina.com.cn/s/blog_7f1dc53b01010mqa.html 实验现象: 开始LED1亮,LED2熄灭,若不隔时间按KEY1则发现LED2因独立看门狗 ...
- UML总结--总体架构
架构图(一): 架构图(二): 转自:http://blog.csdn.net/lsh6688/article/details/5931706
- 数组累加兼eval性能测试
<label> <input type="checkbox" />测试结果 </label> <script> document.g ...
- (转)windows下编译最新的x264
二:<windows下编译最新的x264> X264更新的比较快,每天都有更新,但算法模块,基本结构是没有多大变化的.x264都是用C语言写的包括C99,但C99语法是在VC中是没法用的( ...
- 【Java面试题】21 Java中的异常处理机制的简单原理和应用。
异常指Java程序运行时(非编译)所发生的非正常情况或错误. java对异常进行了分类,不同类型的异常使用了不同的java类,所有异常的根类为java.lang.Throwable.Throwable ...
- thinkphp隐藏模块实例
1.项目中若要隐藏模块的做法 2.配置如下: <?php return array( //'配置项'=>'配置值' 'MODULE_ALLOW_LIST' => array ('Ho ...
- Spring-处理自动装配的歧义性
自动装配可以对依赖注入提供很大帮助,因为它会减少装配应用程序组件时所需的显式装配的数量. 不过,仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不仅有一个bean能够匹配的话,这种歧义性会阻 ...
- 演示-JQuery中伪元素和伪类选择器
HTML代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...