P2469 SDOI2010 星際競速(費用流)

2022-04-30 08:18:10 字數 1108 閱讀 3188

p2469 [sdoi2010]星際競速

最小路徑覆蓋問題

每個星球必須恰好去一次,而每次高速航行都是從乙個星球到另乙個星球。

那麼高速航行的起點可以保證被去過

高速航行和空間跳躍可以是互相獨立

將每個點$i$拆成$i_1,i_2$,套路地連邊

$link(s,i_1,1,0)$

$link(s,i_2,1,val_i)$

$link(i_2,t,1,0)$

對於每條邊$(u,v,w)$:

$link(u_1,v_2,w)$

藍後跑一遍費用流,費用流會覆蓋所有路徑$(i_2,t)$

滿流的最小代價即為答案

#include#include

#include

#include

using

namespace

std;

#define n 2005

#define m 100005

intn,m,s,t,d[n],a[n],p[n],tc;

queue

h; bool

inh[n];

int cnt=1

,hd[n],nxt[m],ed[n],poi[m],val[m],cst[m];

inline

void adde(int x,int y,int v1,int

v2)inline

void link(int x,int y,int v1,int v2)

bool

bfs()}}

if(d[t]==inf) return0;

tc+=a[t]*d[t];

for(int i=t;i!=s;i=poi[p[i]^1

]) val[p[i]]-=a[t],val[p[i]^1]+=a[t];

return1;

}int

main()

for(int i=1;i<=m;++i)

while

(bfs());

printf("%d

",tc);

return0;

}

P2469 SDOI2010 星際競速

pro sol 發現這個模型和最小路徑覆蓋有著密切的聯絡 考慮最小路徑覆蓋是怎麼實現的 一開始用n條長度為1的路徑去覆蓋n個點 使初始答案為n 每個點拆成入點和出點 對於原圖每條邊x y 然後x的出點和y的入點連邊 跑二分圖匹配 求最大流flow 則ans n flow 因為每匹配兩條邊就等價於把x...

P2469 SDOI2010 星際競速

傳送門 分析一下題目,考慮構建費用流模型 為什麼會想到費用流啊!把每個點拆成兩個 u,v 從 v 到 t 連一條流量為 1 費用為 0 的邊 這條邊滿流說明此點走完了 從 s 向每個點 v 連一條流量為 1 費用為能力爆發到此星球的時間 從任何一點跳躍其實就相當於從原點重新開始 從 s 向每個點 u...

P2469 SDOI2010 星際競速(費用流)

p2469 sdoi2010 星際競速 話說如果用上下界網路流就是智障題目了emm 源 點到 i費用0 流量1 源點到i費用0,流量1 源點到i費用 0,流量 1 源 點連 向i 費用為瞬 移的費用 流量1 源點連向i 費用為瞬移的費用,流量1 源點連向i 費用為 瞬移的費 用,流量 1 i 到 匯...