晨跑 費用流

2022-09-03 06:18:08 字數 1101 閱讀 3880

乙個有向圖,每條邊有流量和費用,求在每個點只經過一次的情況下(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個十字路口...