bzoj1834 網路擴容 網路流

2021-08-23 14:30:12 字數 1431 閱讀 9355

好久沒寫題解了啊···

給你一幅n個點的網路,先求出其1到n的最大流,每條弧還會有個屬性co

sti cos

ti

,表示沒擴容乙個單位的費用,現在我們要求的就是擴容k個單位的最小費用

這是一道比較裸的網路流,第一問直接dinic就是了,重點就在於第二問。我們把第一問的殘量網路繼續利用,其中的每條弧的費用都是0,此時我們再在第

i i

條弧的兩端之間在建一條弧,弧的容量是in

f' role="presentation" style="position: relative;">inf

inf,費用就是co

sti cos

ti

。這樣我們固然可以保證費用正確,可是我們保證不了擴容了k,我們就可以建乙個超級源點,連向1號點,容量為k,費用為0。在這個網路中最大流一定是滿流,也就是k啊,此時的最小費用就是我們所要求的。

這就很簡單了,一遍di

nic din

ic

,再一遍mc

mfm cm

f我們就可以了

**如下

#include

#include

#include

#include

using

namespace

std;

const

int maxn=10001,maxm=50001,inf=0x7f7f7f7f;

int n,m,k,tot,next[maxm<<1],beg[maxm<<1],head[maxn],flow[maxm<<1],fflow[maxm<<1],last[maxn],pre[maxn],fl[maxn],nxt[maxm<<1],to[maxm<<1],ccost[maxm<<1],cost[maxm<<1],d[maxn],dep[maxn];

bool vis[maxn];

void addedge(int x,int y,int z,int co,int type)

bool bfs()}}

return dep[n];

}int dfs(int x,int mini)}}

return0;}

int dinic()

}return ret;

}bool spfa() }}

vis[now]=0;

}return pre[n]!=-1;

}int mcmf()

}return ret;

}void rebuild()

}int main()

int ans1=dinic();

rebuild();

int ans2=mcmf();

printf("%d %d\n",ans1,ans2);

return

0;}

bzoj1834 網路擴容

給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數 邊數以及所需要增加的流量。接下來的m行每行包含四個整數u,v...

bzoj1834(網路流 費用流)

給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。第一問裸的網路流 第二問 新建乙個匯點,將n號點與匯點相連,容量為k,限制最多增大的流量 費用為0 將原先每一條邊都新...

BZOJ 1834 網路擴容 最大流 費用流

對於第一問,直接求最大流。對於第二問,建源點s和匯點t,s連1容量為inf,費用為0的邊,n連t容量為最大流 k,費用為0的邊。這樣就把最大流限制為最多增加k了。限制需要求擴充的最小費用,原圖的邊多連一條容量為inf,費用為增容費用k的邊。跑一遍費用流即是答案。include include inc...