dijkstra 最小費用最大流

2022-04-30 00:48:19 字數 2137 閱讀 8563

滑稽

dijkstra同樣為最短路演算法,為什麼不能跑費用流qwq

好像是因為有負權邊的緣故

但是如果我們如果使用某種玄學的將邊權都拉回到正數的話

就可以跑了dijkstra,開心qwq

如果我們每條邊暴力加上乙個很大的值的話,我們還需要記錄所經過的邊數,還要保證不溢位,十分的毒瘤

尻考慮給每個節點乙個勢(ps:不是什麼物理學演算法,就是為了給他起個名字)

然後將我們的最短路轉移\(dis_v=dis_u+w\)改為\(dis_v=dis_u+w+h_u-h_v\)(\(h_i\)是勢),保證\(w+h_u-h_v>=0\)

然後我們觀察蔡依林(霧他對最短路有什麼影響

比如說我們現在有一條\(p_1-p_2-p_3.....p_n\)的這麼一條路徑

其路徑長度則為\((w_1+w_2+w_3...+w_)+(h_1-h_2)+(h_2-h_3)+(h_3-h_4)+......(h_-h_n)\)

然後發現這個玩意\(\to ~ (h_1-h_2)+(h_2-h_3)+(h_3-h_4)+......(h_-h_n)=h_1-h_n\)。如此這樣,我們在算出加勢以後的(無論路線是什麼樣的)最短路後,在減去\(h_-h_\)就可以了

接下來的問題就變成了,如何確定乙個\(h_i\).

我們先考慮變形一下\(w+h_u-h_v>=0~~\to~~h_u+w>=h_v\)

\(wow\),好像三角形不等式呀(在最短路中對於一條從\(u\)到\(v\)的有向邊,總有\(dis_u+w>=dix_v\))。

是不是可以考慮將上一次的\(dis\)當做\(h_i\)(每次\(h_i+=dis_i\))呢?

是可以的,為什麼?

假設現在有一條\(u\to v\)的有向邊

\(\mathcal\)

我們這樣的話就能跑dijkstra了。開心\(qwq\)

而且更快,更穩定,也不容易猝死

↓及其醜陋的**

#include#include#include#includeconst int maxn=101000;

using std::swap;

using std::min;

struct edge

;struct data

return ;

}edge line[maxn<<1];

int head[maxn],tail=-1;

void add(int a,int b,int c,int d)

int h[maxn];

bool vis[maxn];

int dis[maxn];

int from[maxn];

int l[maxn];

int flow[maxn];

int max_flow,min_cost;

bool dijkstra(int begin,int end)

dis[begin]=0;

data pas;

pas.p=begin;pas.d=0;

push(pas);

while(len)//手寫堆怪我嘍

if(vis[pas.p]&&!len) break;

vis[pas.p]=true;

dis[pas.p]=pas.d;

for(int i=head[pas.p];i!=-1;i=line[i].nxt)

if(line[i].f>0&&!vis[line[i].p]&&dis[line[i].p]>dis[pas.p]+line[i].w+h[pas.p]-h[line[i].p])//判斷,帶上勢

}return dis[end]!=0x7fffffff;

}void mcma(int begin,int end)

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

h[i]+=dis[i];//累加,一定要累加,雖然不累加可能過幾個點 }}

int main()

mcma(s,t);//跑費用流

printf("%d %d",max_flow,min_cost);//輸出

return 0;

}

最小費用最大流

網 絡流的基本問題為 設乙個有向賦權圖g v,e v 其中有兩個特殊的節點s和s s稱為發點,s 稱為收點。圖中各 邊的方向和權數表示允許的流向和最大可能的流量 容量 問在這個網路圖中從發點流出到收點匯集,最大可通過的實際流量為多少?流向的分布情況為怎樣?設有乙個網路圖g v,e v e中的每條邊 ...

最小費用最大流

const int maxn 250 const int maxm 62272 const int inf 0x4ffffff int n,m struct edge edge maxm int head maxn cnt void init void addedge int u,int v,int...

最小費用最大流

看了最小費用最大流的問題,感覺好難啊,想不到,關鍵就是想不到,知道模板什麼用,只是能a題僅此而已,要想學深真的不是件容易的事情啊。為此我總結了以下幾點供複習知識點或者是講課時用 網路流的費用 在實際應用中,與網路流有關的問題,不僅涉及流量,而且還有費用的因素。網路的每一條邊 v,w 除了給定容量ca...