給定一張有向圖,每條邊都有乙個容量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 將原先每一條邊都新...