bzoj1834 [ZJOI2010]network 网络扩容
第一问跑最大流,第二问新建一条边连接0和1,流量为上第一问的答案+k,费用为0,接下来图中每条边拆成两条边,第一条容量为C费用为0,第二条容量无穷费用为W,再跑一遍费用流即可。
代码
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<iostream>
- #include<set>
- #include<queue>
- #define mp make_pair
- #define inf 0x37373737
- #define N 30050
- #define M 30050
- using namespace std;
- struct Dinic {
- int s, t, n, pre[N], cur[N], h[N], level[N], sign, q[N];
- int cap[M], to[M], ne[M], flow, e;
- void liu(int u, int v, int w) {
- to[e] = v, ne[e] = h[u], cap[e] = w;
- h[u] = e++;
- }
- void link(int u, int v, int w) {
- liu(u, v, w);
- liu(v, u, );
- }
- void init(int n) {
- for (int i = ; i <= n; ++i)
- h[i] = -;
- e = ;
- }
- bool bfs() {
- int L = , R = ;
- fill(level, level + n, -);
- sign = q[R++] = t;
- level[t] = ;
- while (L < R && level[s] == -) {
- int c = q[L++];
- for (int k = h[c]; ~k; k = ne[k]) {
- if (cap[k ^ ] > && level[to[k]] == -)
- level[to[k]] = level[c] + , q[R++] = to[k];
- }
- }
- return ~level[s];
- }
- void push() {
- int pl = inf, p, k;
- for (p = t; p != s; p = to[k ^ ]) {
- k = pre[p];
- pl = min(pl, cap[k]);
- }
- for (p = t; p != s; p = to[k ^ ]) {
- k = pre[p];
- cap[k] -= pl;
- cap[k ^ ] += pl;
- if (cap[k] == )
- sign = to[k ^ ];
- }
- flow += pl;
- }
- void dfs(int c) {
- if (c == t)
- push();
- else {
- for (int &k = cur[c]; ~k; k = ne[k])
- if (cap[k] > && level[to[k]] + == level[c]) {
- pre[to[k]] = k;
- dfs(to[k]);
- if (level[sign] > level[c])
- return;
- sign = t;
- }
- level[c] = -;
- }
- }
- int run(int _s, int _t, int _n) {
- s = _s, t = _t, n = _n;
- flow = ;
- while (bfs()) {
- for (int i = ; i < n; ++i)
- cur[i] = h[i];
- dfs(s);
- }
- return flow;
- }
- } mf;
- struct MCMF{
- int h[N] , dis[N] , ing[N] , pre[N] , s , t , n;
- int to[M] , ne[M] , cap[M] , cost[M] , e;
- void ini(){
- fill(h,h+N,-);
- e = ;
- }
- void liu(int u,int v,int c,int w){
- to[e] = v , ne[e] = h[u] , cap[e] = c , cost[e] = w;
- h[u] = e++;
- }
- void link(int u,int v,int c,int w){
- liu(u,v,c,w);
- liu(v,u,,-w);
- }
- bool spfa(){
- queue<int> Q;
- fill(ing,ing+n,);
- fill(pre,pre+n,-);
- fill(dis,dis+n,inf);
- ing[s] = true , dis[s] = ;
- Q.push(s);
- while(!Q.empty()){
- int c = Q.front();Q.pop();ing[c] = false;
- for(int k=h[c];~k;k=ne[k]){
- int v = to[k];
- if(cap[k] <= ) continue;
- if(dis[c] + cost[k] < dis[v]){
- dis[v] = dis[c] + cost[k];
- pre[v] = k;
- if(!ing[v]) Q.push(v) , ing[v] = true;
- }
- }
- }
- return dis[t] != inf;
- }
- int flow , mincost;
- pair<int,int> run(int _s,int _t,int _n){
- s = _s , t = _t , n = _n;
- flow = mincost = ;
- while(spfa()){
- int pl = inf , p , k;
- for(p=t;p!=s;p=to[k^]){
- k = pre[p];
- pl = min(pl,cap[k]);
- }
- for(p=t;p!=s;p=to[k^]){
- k = pre[p];
- cap[k] -= pl;
- cap[k^] += pl;
- }
- mincost += pl * dis[t];
- flow += pl;
- }
- return mp(flow,mincost);
- }
- };
- MCMF mcmf;
- int n,m,k,i,a,b,c,d,flow,cost;
- int main()
- {
- scanf("%d%d%d",&n,&m,&k);
- mf.init(n+);
- mcmf.ini();
- for (i=;i<=m;i++)
- {
- scanf("%d%d%d%d",&a,&b,&c,&d);
- mf.link(a,b,c);
- mcmf.link(a,b,c,);
- mcmf.link(a,b,,d);
- }
- flow=mf.run(,n,n+);
- mcmf.link(,,flow+k,);
- printf("%d %d",flow,mcmf.run(,n,n+).second);
- }
bzoj1834 [ZJOI2010]network 网络扩容的更多相关文章
- BZOJ1834 [ZJOI2010]network 网络扩容 【最大流,费用流】
1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3394 Solved: 1774 [Subm ...
- [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 网络扩容
还是稍微记一下这个拆点模型吧 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< ...
- 【BZOJ1834】[ZJOI2010]network 网络扩容 最大流+最小费用流
[BZOJ1834][ZJOI2010]network 网络扩容 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不 ...
- bzoj1834: [ZJOI2010]network 网络扩容
努力看了很久样例一直过不了...然后各种输出中间过程啊巴拉巴拉弄了1h,没办法了...然后突然想到啊原来的边可以用啊为什么不用...于是A了...感人肺腑 #include<cstdio> ...
随机推荐
- Cookie操作
1.写cookie方法 #region 登录时写入cookie public static void LoginCookieSave(string uid, string loginname, str ...
- AppleScript
一.资源 1.书本 2.ide: AppleSreipt Editor 3.界面辅助软件: UIBrowser 破解方法: a) ui browser -> show package conte ...
- Qt调用dll中的功能函数
声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下: ...
- 让Qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性
环境:Desktop Qt 5.4.1 MSVC2013 32bit 需要的库:dwmapi.lib .user32.lib 需要头文件:<dwmapi.h> .<windowsx. ...
- 转NodeJS的npm模块版本号 模式解析
npm 中的模块版本都需要遵循 semver 2.0 的语义化版本规则. 版本格式:主版本号.次版本号.修订号,版本号递增规则如下: 主版本号:当你做了不兼容的API 修改, 次版本号:当你做了向下兼 ...
- An Implementation of Double-Array Trie
Contents What is Trie? What Does It Take to Implement a Trie? Tripple-Array Trie Double-Array Trie S ...
- LightOj1190 - Sleepwalking(判断点与多边形的位置关系--射线法模板)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1190 题意:给你一个多边形含有n个点:然后又m个查询,每次判断点(x, y)是否在多边 ...
- IntelliJ IDEA gradle 创建 Java web 应用
1.如下图,第一步很简单的,File->New->Project 2.在左边栏目找到Gradle,然后在右边勾选Java 和web 两个选项,next.如果只是Java项目就只选java就 ...
- POJ 1041问题描述
Description Little Johnny has got a new car. He decided to drive around the town to visit his friend ...
- 浅析 Linux 初始化 init 系统,第 1 部分: sysvinit 第 2 部分: UpStart 第 3 部分: Systemd
浅析 Linux 初始化 init 系统,第 1 部分: sysvinit 第 2 部分: UpStart 第 3 部分: Systemd http://www.ibm.com/developerw ...