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 到 匯...