給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求: 1、 在不擴容的情況下,1到n的最大流; 2、 將1到n的最大流增加k所需的最小擴容費用。
輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數、邊數以及所需要增加的流量。 接下來的m行每行包含四個整數u,v,c,w,表示一條從u到v,容量為c,擴容費用為w的邊。
輸出檔案一行包含兩個整數,分別表示問題1和問題2的答案。
輸入 #1複製
5 8 21 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
輸出 #1複製
13 19
30%的資料中,n<=100
100%的資料中,n<=1000,m<=5000,k<=10
有點暴力。先跑一遍dinic,求出第一問的解,再重新建圖,講擴容記為容量inf,費用的邊,最後新建t點,容量為maxflow+k,跑最大流最小費用,即可得到ans。
#include#define n 10700#define m 107000
#define inf 1<<29
using
namespace
std;
struct
nodee[m*2
];int tot=1,head[n],maxflow=0,ans=0
;int
x[m],y[m],z[m],cost[m];
intn,m,s,t,k;
void add(int x,int y,int z,int
p)int
incf[n],v[n],pre[n],d[n];
queue
q;bool
bfs()} }
return0;
}int dinic(int x,int
flow)
}return flow-rest;
}bool
spfa()}}
if(d[t]==0x3f3f3f3f) return
false;//
0xcfcfcfcf
return
true;}
void
update()
maxflow+=incf[t];
ans+=d[t]*incf[t];
}void
rebuild()
add(n,n+1,maxflow+k,0);}
intmain()
s=1;t=n;
while
(bfs())
while(flow=dinic(s,inf)) maxflow+=flow;
cout
<"";
rebuild();
while
(spfa()) update();
cout
return0;
}
洛谷P2604 ZJOI2010 網路擴容
題目大意 給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1.在不擴容的情況下,1到n的最大流 2.將1到n的最大流增加k所需的最小費用。題解 先跑最大流,在殘餘網路上跑費用流 卡點 無 c code include include include ...
ZJOI2010 網路擴容
題目描述 給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。輸入格式 輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數 邊數以及所需要增加的流量。接下來的m行每...
ZJOI2010 網路擴容
最大流 費用流 洛谷位址 第一問就直接跑最大流。第二問目前有兩種方法 include include include include using namespace std define inf 0x7fffffff int n,m,k,s,t struct edgee 100005 int fir...