BZOJ 1834网络扩容题解
一道不算太难的题目
但是真的很恶心
显然,对于第一问,我们直接无脑打模板就好了
第二问也不是很难,我们将每条边再连一条容量为inf,费用为w的边
但是流量只要小于第一问的答案加k就行了
所以我们增加一个点为第二问的汇点,将n与它连接一条容量为ans+k,费用为0的边
跑费用流就好了
但是!!!!!!!
这样作只有40分,为什么呢。
因为虽然数据范围说n<=1000但给的点编号有大于1000的点。。。。。
我们只要将点数视为5000就可以过来了
真的恶心。。。。
不过在考场上还是建议用离散化,毕竟你不知道点数编号的范围
想问一问当初省选时有多少人被这个给坑了。。
# include<iostream>
# include<cstdio>
# include<cmath>
# include<algorithm>
# include<cstring>
# include<queue>
using namespace std;
const int mn = ;
const int inf = 0xfffffff;
struct edge{
int to,next,flow,cup,cost;
edge(){to=flow=cup=cost=,next=-;}
};
edge e[mn*];
int head[mn],edge_max=-;
void add(int x,int y,int k,double c)
{
e[++edge_max].to=y;
e[edge_max].next=head[x];
e[edge_max].flow=e[edge_max].cup=k;
e[edge_max].cost=c;
head[x]=edge_max;
}
int n,m,k;
int ans1,ans2;
int deep[mn];
int cur[mn];
queue<int> q;
bool bfs(int x,int y)
{
memset(deep,,sizeof(deep));
q.push(x);
deep[x]=;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-;i=e[i].next)
{
if(deep[e[i].to]== && e[i].flow> )
{
deep[e[i].to]=deep[u]+;
q.push(e[i].to);
}
}
}
if(deep[y]==)
return false;
else return true;
}
int dfs(int x,int dist,int y)
{
if(x==y)
return dist;
for(int &i=cur[x];i!=-;i=e[i].next)
{
if(deep[e[i].to]==deep[x]+ && e[i].flow!=)
{
int di=dfs(e[i].to,min(dist,e[i].flow),y);
if(di>)
{
e[i].flow-=di;
e[i^].flow+=di;
return di;
}
}
}
return ;
}
void dinic(int x,int y)
{
while(bfs(x,y))
{
for(int i=;i<=n;i++)
cur[i]=head[i];
while(int k=dfs(x,inf,y))
ans1+=k;
}
}
int dis[mn];
int pe[mn],pv[mn];
bool vis[mn];
bool spfa(int x,int y)
{
memset(vis,,sizeof(vis));
for(int i=;i<=n+;i++)
dis[i]=inf;
dis[x]=;
vis[x]=;
q.push(x);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=;
for(int i=head[u];i!=-;i=e[i].next)
{
if(dis[u]+e[i].cost<dis[e[i].to] && e[i].flow>)
{
dis[e[i].to]=e[i].cost+dis[u];
pe[e[i].to]=i;
pv[e[i].to]=u;
if(!vis[e[i].to])
{
q.push(e[i].to);
vis[e[i].to]=;
}
}
}
}
if(dis[y]!=inf)
return true;
else return false;
}
void max_flow(int x,int y)
{
while(spfa(x,y))
{
int mflow=inf;
for(int i=y;i!=x;i=pv[i])
{
mflow=min(mflow,e[pe[i]].flow);
}
ans2+=dis[y]*mflow;
for(int i=y;i!=x;i=pv[i])
{
e[pe[i]].flow-=mflow;
e[pe[i]^].flow+=mflow;
}
}
}
int a1[mn],a2[mn],a3[mn],a4[mn];
void pre()
{
memset(head,-,sizeof(head));
memset(e,-,sizeof(e));
for(int i=;i<=m;i++)
{
add(a1[i],a2[i],a3[i],);
add(a2[i],a1[i],,);
add(a1[i],a2[i],inf,a4[i]);
add(a2[i],a1[i],,-a4[i]);
}
}
int main()
{
int x,y,c,w;
memset(head,-,sizeof(head));
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=m;i++)
{
scanf("%d%d%d%d",&a1[i],&a2[i],&a3[i],&a4[i]);
add(a1[i],a2[i],a3[i],);
add(a2[i],a1[i],,);
}
dinic(,n);
pre();
add(n,n+,ans1+k,);
add(n+,n,,);
max_flow(,n+);
printf("%d %d",ans1,ans2);
return ;
}
BZOJ 1834网络扩容题解的更多相关文章
- BZOJ 1834 网络扩容 最大流+最小费用流
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1834 题目大意: 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是 ...
- BZOJ 1834 网络扩容(最大流+费用流)
对于第一问,直接求最大流. 对于第二问,建源点s和汇点t,s连1容量为INF,费用为0的边,n连t容量为最大流+k,费用为0的边.这样就把最大流限制为最多增加k了. 限制需要求扩充的最小费用,原图的边 ...
- BZOJ1834:[ZJOI2010]网络扩容——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1834 https://www.luogu.org/problemnew/show/P2604#sub ...
- 【BZOJ】【1834】【ZJOI2010】Network 网络扩容
网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...
- 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和一 ...
- 【题解】Luogu P2604 [ZJOI2010]网络扩容
原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 ...
- 【bzoj1834】[ZJOI2010]network 网络扩容
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 2701 Solved: 1368[Submit ...
- C++之路进阶——codevs1362(网络扩容)
1362 网络扩容 省队选拔赛 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给定一张有向图,每条边都有一个容量 ...
随机推荐
- Python list以及numpy处理技巧
1.numpy数组后面添加一个list: import numpy as np a=[[1,2,3],[4,5,6],[7,8,9]] box=np.array(a) box=np.vstack((b ...
- Luogu P1948 [USACO08JAN]电话线Telephone Lines(最短路+dp)
P1948 [USACO08JAN]电话线Telephone Lines 题意 题目描述 Farmer John wants to set up a telephone line at his far ...
- Django项目:CRM(客户关系管理系统)--47--38PerfectCRM实现全局账号登录注销02
图片另存为 16*16 名字修改为 global_logo.jpg /*! *bootstrap.js * * Bootstrap v3.3.7 (http://getbootstrap ...
- Leetcode628.Maximum Product of Three Numbers三个数的最大乘积
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积. 示例 1: 输入: [1,2,3] 输出: 6 示例 2: 输入: [1,2,3,4] 输出: 24 注意: 给定的整型数组长度 ...
- 一个宽度不确定的DIV里放三个水平对齐的DIV,左右两个DIV宽度固定为100px,中间那个DIV自适应宽度
方法一:浮动 注意三个div的位置 <html><head> <meta charset="utf-8"> <style type=&q ...
- JavaScript文件与HTML文件本地连接
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ML面试1000题系列(61-70)
本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 61.说说共轭梯度法? @wtq1993,htt ...
- go struct 继承
- 为什么DW的可视化下看到的效果与浏览器的效果有所区别?
可视区不是调用外面浏览器,Dreamweav 可视化区是为用户编辑而设计. 支持最基本的 HTML 与 CSS ,对 CSS 而言,我写入样式时如果你使用最基本的样式时它显示与你浏览器中看的效果相差不 ...
- Python数据分析与展示[第三周](pandas数据特征分析单元8)
数据理解 基本统计 分布/累计统计 数据特征 数据挖掘 数据排序 操作索引的排序 .sort_index() 在指定轴上排序,默认升序 参数 axis=0 column ascending=True ...