這場比賽我就不多說什麼了。。。幾乎整場都在寫計算幾何,恰好三維計算幾何又是我的軟肋,後面的題基本都沒看。。。
建圖就不多說了,挺水的,標算不是費用流,但我聽說有人zkw費用流過了,於是我就寫個原始對偶費用流,但是居然超了,本機測試60組極限1050+ms==。。。於是進行優化,lyp跟我說過一次反向spfa就可以dij下去了,但是自己推了一下,有乙個對原圖的邊修改的過程.
考慮i->j,w[i][j]>0,操作應該是w[i][j]-=d[i]-d[j],因為d[i]-d[j]<=w[i][j],所以w[i][j]-(d[i]-d[j])>=0,但是考慮反邊w[j][i]-=d[j]-d[i],也就是-w[i][j]+d[i]-d[j],因為d[i]-d[j]<=w[i][j],所以這個反邊貌似還是負的,因此修改過一次後不是所想的全為正權邊,從而不能dij,lyp以前看到的那篇**找不到了,所以也沒法繼續**下去,我自己也不是很理解這個演算法的理論基礎- -,於是另闢蹊徑,用了春瀟最喜歡的優先佇列+spfa,瞬間600+ms過了...
原始對偶費用流對於點度比較大的圖貌似確實有些慢...
#include #include #include #include #include #include #include #define sqr(x) ((x)*(x))
const int oo=1073741819;
using namespace std;
int tail[250],d[250],v[250],flag[250],x[250],y[250],z[250],w[250],b[1050],p[250];
int next[150000],sora[150000],flow[150000],cost[150000],st[150000],po[150000];
int n,ss,s,t,phi,ans,sum,w_time,e,m1;
void change(int x,int w)
bool spfa(int s,int t)
return 1;
}int dfs(int x,int low)
int sum=0,tmp,ne;
flag[x]=w_time;
for (int i=x;next[i];)
bool spfa(int s,int t)
{ int ne,na;
for (int i=0;i<=t;i++) d[i]=p[i]=oo;
p[t]=0;
change(t,p[t]);
for (;d[b[1]]!=oo;) {
ne=b[1];
change(ne,oo);
for (int i=ne;next[i];) {
i=next[i],na=sora[i];
if (flow[po[i]] && p[ne]+cost[po[i]]+p[ne]=oo) return 0;
for (int i=1;i<=t;i++)
if (p[i]
原始對偶費用流
用 dijkstra 代替 spfa link,但是這篇部落格的 上來就跑 dijkstra 複雜度可能會被卡成指數。text interval graph text 滿足題意的充要條件 每個點至多被兩個區間覆蓋。i rightarrow i 1 連一條流量為 2 費用為 0 的邊。l righta...
學習筆記 最小費用流之原始對偶
兼具zkw和spfa的優點,折中的一種演算法,通過spfa跑出最短路,然後更改邊的權值 加上dis from dis to 那麼如果為0就是在from到to最短路上的點,相當於一種分層 個人理解 就可以用多路增廣來搞了。而這裡的spfa除了第一次外甚至可以拿dij來替換,不過因為加了slf優化的sp...
Primal Dual 原始對偶
不是費用流都需要用 spfa 嗎。眾所周知,spfa 去世了,然後網路流顯然有負邊。於是我們可以像 johnson 全源最短路一樣,給邊加上勢能,具體實現看我之前的 部落格 啦。然後對於每一次跑 dijkstra 然後得到最短路,把勢能要再加上這個最短路,可以證明這樣操作一次圖上不會再有負邊。也正因...