[Luogu 2604] ZJOI2010 网络扩容
[Luogu 2604] ZJOI2010 网络扩容
第一问直接最大流。
第二问,添加一遍带费用的边,边权 INF,超级源点连源点一条容量为 \(k\) 的边来限流,跑费用流。
大约是第一次用 namespace 封装,感觉还好。
#include <cstdio>
#include <cstring>
#include <queue>
using std::min;
using std::queue;
const int MAXN=1010,MAXM=10010,INF=0x3f3f3f3f;
int n,m,k,S,T,cnt,head[MAXN];
struct Edge
{
int nxt,to,w,f;
Edge(int nxt=0,int to=0,int w=0,int f=0):nxt(nxt),to(to),w(w),f(f){}
}e[MAXM<<1];
void AddEdge(int u,int v,int w,int f)
{
e[++cnt]=Edge(head[u],v,w,f),head[u]=cnt;
}
void AddEdges(int u,int v,int w,int f)
{
AddEdge(u,v,w,f),AddEdge(v,u,0,-f);
}
struct Query
{
int u,v,c,w;
void Init(void)
{
scanf("%d %d %d %d",&u,&v,&c,&w);
AddEdges(u,v,c,0);
}
void Rebuild(void)
{
AddEdges(u,v,INF,w);
}
}a[MAXM];
namespace MaxiumFlow
{
static int dis[MAXN],cur[MAXN];
bool BFS(void)
{
queue<int> q;
memset(dis,0,sizeof dis);
q.push(S),dis[S]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u],v;i;i=e[i].nxt)
if(e[i].w && !dis[v=e[i].to])
q.push(v),dis[v]=dis[u]+1;
}
return dis[T];
}
int DFS(int u,int k)
{
if(u==T || !k)
return k;
int sum=0;
for(int i=cur[u],v,f;i;i=e[i].nxt)
if(e[i].w && dis[v=e[i].to]==dis[u]+1 && (f=DFS(v,min(k,e[i].w))))
{
cur[u]=i;
e[i].w-=f,e[((i-1)^1)+1].w+=f;
k-=f,sum+=f;
}
if(!sum)
dis[u]=0;
return sum;
}
void Dinic(void)
{
int ans=0;
while(BFS())
{
memcpy(cur,head,sizeof head);
ans+=DFS(S,INF);
}
printf("%d ",ans);
}
}
namespace MiniumCost
{
static bool exist[MAXN];
static int dis[MAXN],pre[MAXN],pre_e[MAXN],flow[MAXN];
bool SPFA(void)
{
queue<int> q;
memset(exist,0,sizeof exist);
memset(dis,0x3f,sizeof dis);
memset(pre,0,sizeof pre);
memset(pre_e,0,sizeof pre_e);
memset(flow,0x3f,sizeof flow);
q.push(S),exist[S]=1,dis[S]=0;
while(!q.empty())
{
int u=q.front();
q.pop(),exist[u]=0;
for(int i=head[u],v;i;i=e[i].nxt)
if(e[i].w && dis[v=e[i].to]>dis[u]+e[i].f)
{
dis[v]=dis[u]+e[i].f;
pre[v]=u,pre_e[v]=i;
flow[v]=min(flow[u],e[i].w);
if(!exist[v])
q.push(v),exist[v]=1;
}
}
return dis[T]^INF;
}
void MCMF(void)
{
int ans=0;
while(SPFA())
for(int i=T,t;i^S;i=pre[i])
{
e[t=pre_e[i]].w-=flow[T];
e[((t-1)^1)+1].w+=flow[T];
ans+=e[t].f*flow[T];
}
printf("%d\n",ans);
}
}
int main(int argc,char *argv[])
{
scanf("%d %d %d",&n,&m,&k);
S=1,T=n;
for(int i=1;i<=m;++i)
a[i].Init();
MaxiumFlow::Dinic();
for(int i=1;i<=m;++i)
a[i].Rebuild();
AddEdges(--S,1,k,0);
MiniumCost::MCMF();
return 0;
}
谢谢阅读。
[Luogu 2604] ZJOI2010 网络扩容的更多相关文章
- 【题解】Luogu P2604 [ZJOI2010]网络扩容
原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 ...
- BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
题目连接: (luogu) https://www.luogu.org/problemnew/show/P2604 (bzoj) https://www.lydsy.com/JudgeOnline/p ...
- 洛谷 P2604 [ZJOI2010]网络扩容 解题报告
P2604 [ZJOI2010]网络扩容 题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. ...
- BZOJ1834:[ZJOI2010]网络扩容——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1834 https://www.luogu.org/problemnew/show/P2604#sub ...
- ZJOI2010网络扩容
无限orz hzwer神牛…… 第一问很简单,按数据建图,然后一遍最大流算法即可. 第二问则需要用最小费用最大流算法,主要是建图,那么可以从第一问的残留网络上继续建图,对残留网络上的每一条边建 ...
- BZOJ1834[ZJOI2010]网络扩容——最小费用最大流+最大流
题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容费用 ...
- [ZJOI2010]网络扩容
OJ题号: BZOJ1834.洛谷2604 思路: 对于第一问,直接跑一遍最大流即可. 对于第二问,将每条边分成两种情况,即将每条边拆成两个: 不需扩容,即残量大于零时,相当于这条边费用为$0$: 需 ...
- 1834. [ZJOI2010]网络扩容【费用流】
Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需 ...
- [洛谷P2604][ZJOI2010]网络扩容
题目大意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小费用. 题解 ...
随机推荐
- Thunder团队第三周 - Scrum会议5
Scrum会议5 小组名称:Thunder 项目名称:i阅app Scrum Master:苗威 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传康 ...
- 20172330 2017-2018-1 《Java程序设计》第五周学习总结
20172330 2017-2018-1 <Java程序设计>第五周学习总结 教材学习内容总结 第五章 首先是对各种各种运算符的了解:刚开始以为相等就是=,还有其他一些符号都挺简单的,然后 ...
- OSG配置捷径,VS2013+WIN10
在自己电脑上用CMAKE已经编译好了,上传到百度云里面了. 环境是WIN10+VS2013. 链接:http://pan.baidu.com/s/1hrO7GFE 密码:fwkw 解压之后放在C盘或者 ...
- shell基础练习题讲解
1037774765 克隆 1.创建一个用户redhat,其ID号为1001,基本组为like(组ID为2002),附近租为linux. groupadd -g 2002 likegroupadd l ...
- Spring MVC 之@Controller@RequestMapping详解
一:配置web.xml 1)问题:spring项目中有多个配置文件mvc.xml dao.xml 2)解决:在web.xml中 <init-param> <param-name& ...
- Qt Pro文件与Qt模块启用
看qt论坛中经常有人忘记 QT+=network 等语句.随便写写吧,或许对他人有帮助. 一.从哪开始呢 不妨先看个例子吧: #include <QtCore/QCoreApplication& ...
- 【bzoj3312】[Usaco2013 Nov]No Change 状态压缩dp+二分
题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...
- BZOJ5466 NOIP2018保卫王国(倍增+树形dp)
暴力dp非常显然,设f[i][0/1]表示i号点不选/选时i子树内的答案,则f[i][0]=Σf[son][1],f[i][1]=a[i]+Σmin(f[son][0],f[son][1]). 注意到 ...
- android eclipse ndk使用记录
为方便开发jni程序,android提供了ndk包来简化开发过程,避免开发人员下载完整的平台代码,并且可以在windows环境下集成到eclipse里面,大大加快了开发速度.这里记录下一个简单例子. ...
- 洛谷 P2898 [USACO08JAN]haybale猜测Haybale Guessing 解题报告
[USACO08JAN]haybale猜测Haybale Guessing 题目描述 给一段长度为\(n\),每个位置上的数都不同的序列\(a[1\dots n]\)和\(q\)和问答,每个问答是\( ...