P2469 SDOI2010 星際競速

2022-05-07 23:09:25 字數 1311 閱讀 4576

pro:

sol:

發現這個模型和最小路徑覆蓋有著密切的聯絡

考慮最小路徑覆蓋是怎麼實現的

一開始用n條長度為1的路徑去覆蓋n個點

使初始答案為n

每個點拆成入點和出點

對於原圖每條邊x--->y

然後x的出點和y的入點連邊

跑二分圖匹配

求最大流flow

則ans=n-flow

因為每匹配兩條邊就等價於把x所在的路徑和y所在路徑連線在一起

答案應該-1

再考慮本題

還是先考慮n條路徑的情況

答案顯然為\(\sum_^n a_i\)

然後考慮連線兩條路徑時能省掉多少代價

發現新增了邊權\(w\),減少了新開一條路徑的費用\(a_y\)

因此這個問題和最小路徑類似

只不過不在是簡單的二分圖最大匹配

而是變成了乙個帶權二分圖最大匹配

這個玩意顯然就是個最大費用流

衝就完事了

#include#define n 11000

#define m 110000

#define eps 1e-7

#define inf 1e12

#define db double

#define ll long long

#define ldb long double

#define ull unsigned long long

using namespace std;

inline ll read()

while(isdigit(ch))

return x*flag;

}struct edge

e[m];

ll num,head[n];

inline void add(ll x,ll y,ll w,ll z)

;head[x]=num;

e[++num]=(edge);head[y]=num;

}bool in_queue[n];

ll n,m,s,t,dis[n],pre[n],last[n],flow[n];

queueq;

bool spfa()

void dfs(ll x)

ll a[n];

int main()

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

while(spfa())ans-=dis[t]*flow[t],dfs(t);

printf("%lld",ans);

return 0;

}

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

P2469 SDOI2010 星際競速(費用流)

p2469 sdoi2010 星際競速 最小路徑覆蓋問題 每個星球必須恰好去一次,而每次高速航行都是從乙個星球到另乙個星球。那麼高速航行的起點可以保證被去過 高速航行和空間跳躍可以是互相獨立的 將每個點 i 拆成 i 1,i 2 套路地連邊 link s,i 1,1,0 link s,i 2,1,v...