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