乙個有向圖,每條邊有流量和費用,求在每個點只經過一次的情況下(ss和t
t除外)的最小費用最大流。
原題也很容易看出是費用流。難點在於如何保證每個點只經過一次。
那麼不妨將除s,t
s,t之外的點進行拆點。每個點可以拆成入點和出點,流量為1,費用為0。這樣就可以保證每個點之間的邊只能走一次,就達成了每個點只能經過一次的效果。
最終的建模如下:
#include
#include
#include
#include
#define inf 1e9
using
namespace std;
int n,m,k,s,t,head[
80001
],dist[
501]
,p[80001
],x,y,z,minn,maxflow,cost;
bool vis[
501]
;struct edge
e[80001];
void
add(
int from,
int to,
int c,
int w)
bool
spfa()
queue<
int> q;
q.push
(s);
dist[s]=0
; vis[s]=1
;while
(q.size()
)}}}
return
(dist[t]
void
addflow()
maxflow+
=minn;
cost+
=dist[t]
*minn;
}int
main()
for(
int i=
2;i)while
(spfa()
)addflow()
;printf
("%d %d\n"
,maxflow,cost)
;return0;
}
BZOJ1877 晨跑(費用流)
elaxia最近迷戀上了空手道,他為自己設定了一套健身計畫,比如俯臥撐 仰臥起坐等 等,不過到目前為止,他 堅持下來的只有晨跑。現在給出一張學校附近的地圖,這張地圖中包含n個十字路口和m條街道,elaxia只能從 一 個十字路口跑向另外乙個十字路口,街道之間只在十字路口處相交。elaxia每天從寢室...
BZOJ1877 晨跑(費用流)
elaxia最近迷戀上了空手道,他為自己設定了一套健身計畫,比如俯臥撐 仰臥起坐等 等,不過到目前為止,他 堅持下來的只有晨跑。現在給出一張學校附近的地圖,這張地圖中包含n個十字路口和m條街道,elaxia只能從 一 個十字路口跑向另外乙個十字路口,街道之間只在十字路口處相交。elaxia每天從寢室...
bzoj1877 晨跑(費用流)
time limit 4 sec memory limit 64 mb submit 2138 solved 1145 elaxia最近迷戀上了空手道,他為自己設定了一套健身計畫,比如俯臥撐 仰臥起坐等 等,不過到目前為止,他堅持下來的只有晨跑。現在給出一張學校附近的地圖,這張地圖中包含n個十字路口...