bzoj1834 網路擴容

2022-06-03 21:54:08 字數 1632 閱讀 7201

給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求: 1、 在不擴容的情況下,1到n的最大流; 2、 將1到n的最大流增加k所需的最小擴容費用。

輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數、邊數以及所需要增加的流量。 接下來的m行每行包含四個整數u,v,c,w,表示一條從u到v,容量為c,擴容費用為w的邊。

輸出檔案一行包含兩個整數,分別表示問題1和問題2的答案。

5 8 2

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

13 19

30%的資料中,n<=100

100%的資料中,n<=1000,m<=5000,k<=10

無聊的最大流+費用流

//serene

#include#include#include#include#include#includeusing namespace std;

const int maxn=1000+10,maxm=3*5000+10,inf=0x3f3f3f3f;

int n,m,k,tu[maxn],s,t;

int aa,bb;char cc;

int read()

while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();

return aa*bb;}

struct node

node(int x,int y,int cap,int w) :x(x),y(y),cap(cap),w(w){}

}node[2*maxm];

int cur[maxn],fir[maxn],nxt[2*maxm],e=1;

void add(int x,int y,int z,int w)

int zz[maxn],from[maxn],dis[maxn];bool vis[maxn];

bool spfa()

from[z]=y;

dis[z]=dis[x]+node[y].w;

}vis[x]=0;s++;

}return dis[t]!=inf;}

int mcmf()

}return rs;

}////////////////////////////////////

bool bfs()

}return dis[t]!=-1;}

int dfs(int pos,int maxf)

if(!rs) dis[pos]=-1;

return rs;}

int dinic()

return re;}

int ff[3*maxm],ff_tot=0;

int main()

printf("%d ",dinic());

for(int i=1;i<=ff_tot;++i) add(ff[i*3-2],ff[i*3-1],inf,ff[i*3]);

printf("%d",mcmf());

return 0;

}

模板拼接

bzoj1834 網路擴容 網路流

好久沒寫題解了啊 給你一幅n個點的網路,先求出其1到n的最大流,每條弧還會有個屬性co sti cos ti 表示沒擴容乙個單位的費用,現在我們要求的就是擴容k個單位的最小費用 這是一道比較裸的網路流,第一問直接dinic就是了,重點就在於第二問。我們把第一問的殘量網路繼續利用,其中的每條弧的費用都...

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

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

bzoj1834(網路流 費用流)

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