再談網路流

2021-09-30 11:31:09 字數 1242 閱讀 9238

在這裡我已經討論過網路流最大流基本演算法,但是我們可以對這個演算法進行時間上的優化。其中效果比較好的當屬「最短增廣路演算法」,即每次都沿著最短增廣路(即邊數最少的增廣路)進行增廣。下面要介紹的演算法均使用如下資料結構來表示一條弧。

struct edge ;
這代表一條從from到to的容量為cap,流量為flow的弧。當且僅當flow

void addedge (int from, int to, int cap));

edges.push_back((edge));

m = edges.size();

g[from].push_back(m-2);

g[to].push_back(m-1);

}

這個資料結構兼顧了效率,**清晰度和除錯難度,它的最大的好處就是同時適用於稠密圖和稀疏圖,而且支援重邊。我們很快就會看到,重邊在最小費用流裡是不能避免的。

struct edge 

void addedge (int from, int to, int cap));

edges.push_back((edge));

m = edges.size();

g[from].push_back(m-2);

g[to].push_back(m-1);

}int n,m,s,t; //結點數,邊數(包括反向弧),源點編號,匯點編號

vectoredges; //邊表 edge[e]和edge[e^1]互為反向弧

vectorg[maxn]; //鄰接表,g[i][j]表示點i的第j條邊在e陣列中得序號

bool vis[maxn]; //bfs中使用

int d[maxn] //從起點到i的距離

int cur[maxn] //當前弧下表 (後面繼續說明)

bool bfs ()

} }return vis[t];

}int dfs (int x, int a) //dfs過程除了當前結點x外,還需要傳入乙個表示目前為止所有弧的最小殘量的a,當x為匯點,或者a=0時終止dfs過程,否則多路增廣。這裡還有乙個重要的優化:儲存每個結點x正在考慮的弧cur[x],以避免重複計算

} return flow;

}//最後主過程,不停的用bfs構造分層網路,然後用dfs沿著阻塞流增廣。

int maxflow ()

return flow;

}

再談工作流模式

文章後半部份內容跑題了 有些朋友對乙個具體的業務流程使用何種工作流模式實現總是拿不定主意,個人覺得設計工作流,其實沒有什麼應該的模式,用狀態機模式作主流程,管理業務狀態,流模式作子流程,完成具體的業務操作是乙個不錯的方案。有時業務流程不是一定要用工作流才能實現,有些系統因其型別 規模 應用 成本 時...

再談網路遊戲同步

呵呵,一年前的這個時候發過一系列討論網路遊戲同步的帖子。一年後的今天,再重新討論討論這個問題。不知道大家是否碰到過這種情況,當某個玩家發出乙個火球,這個火球有自己的運動 軌跡,那麼如何來判斷火球是否打中了人呢?大部分情況,當策劃提出這個要求的時 候,一般會被程式否認,原因是 太麻煩了,呵呵。複雜點的...

網路流 費用流

這個好像不考 沒事可以騙分 費用流,顧名思義,就是有費用的流,也就是說,給乙個網路流圖中的每條弧增加乙個單位流量費用。一般來說求解的費用流都是最大流最小費用。好像沒什麼好bb的 這裡推薦使用zkw演算法求解最小費用流,看著 理解就行,應該還是很好理解的。zkw演算法在稠密圖上跑得飛快,在稀疏圖上還不...