這個主題以前沒接觸過,覺得有點抽象,演算法有點不太清楚,看了一些部落格,下面,對這些部落格做些總結。
具體參考這篇部落格的背景知識講解部分(具體到**之前),首先對網路流有了乙個初步的印象
然後一些概念性的定義,具體參考這篇部落格,對一些可能會影響到演算法理解的基礎概念進行掌握
然後接觸到演算法,顯示ff(ford-fulkerson)演算法的思想,用的是dfs,主要理解增加的反向邊和演算法的流程。然後是ek演算法,也是上面一篇部落格
對演算法大致了解後可以看看例項,上面一篇部落格的圖是個理解負向邊很好的例子,加上這篇部落格
結合演算法對例項的分析
下面就可以看**了,主要是這幾篇部落格比較清晰:
最後的總結這篇部落格更適合:分析的比較細,雖然我還不太真正的明白在講些什麼,但估計熟悉以後就會明白了吧
//edmonds karp
#include #include #include #include #define maxn 1005
#define inf 0x3f3f3f3f
using namespace std;
struct edge
};struct edmondskarp
}if(a[t]) break;//若已拓展到t點,跳出
}if(!a[t])//若無法到達a點,說明無增廣路,結束演算法
for(int u = t;u!=s;u=edges[p[u]].from)//從t開始向前更新路徑上的流
flow += a[t];
}return flow;
}};
//ford fulkerson
#include #include #include #define maxn 1005
#define inf 0x3f3f3f3f
using namespace std;
struct edge
;vectorg[maxn];//圖的鄰接表表示
bool used[maxn];//dfs中用到的訪問標記
void add_edge(int from,int to,int cap)
);//記錄反向邊在to個節點的vector中的位置
g[to].push_back((edge));
}int dfs(int v,int t,int f)}}
return 0;//未找到增廣路
}int max_flow(int s,int t)
flow += f;
}}
//dinic
#include #include #include #include #define maxn 1005
using namespace std;
struct edge
;vectorg[maxn];//圖的鄰接表表示
int level[maxn];//頂點到原點的距離標號
int iter[maxn];//當前弧,在之前的變已經沒有用了
void add_edge(int from,int to,int cap)
); g[to].push_back((edge));
}//通過bfs尋找從原點出發的且未滿流的距離標號
void bfs(int s)}}
}//通過dfs尋找增廣路
int dfs(int v,int t,int f)}}
return 0;//找不到增廣路
}
以上模板的表示方式都不太一樣,理解後可方便自己選擇 初學網路流(超詳細) 保證弄懂
最近在學習二分圖匹配,網路流和博弈論 eazy,miaomiao,lsr dalao,zyh,zlt 感謝諸位牛犇給蒟蒻的講課,讓我受益匪淺,ppt就不放上來了,有版權問題,下面我給大家談談我近期學習網路流的心得。因為前幾天感冒落了些進度,感謝ergeda和腦屁股的細心輔導 微笑吐舌頭 根據lsr ...
網路流 費用流
這個好像不考 沒事可以騙分 費用流,顧名思義,就是有費用的流,也就是說,給乙個網路流圖中的每條弧增加乙個單位流量費用。一般來說求解的費用流都是最大流最小費用。好像沒什麼好bb的 這裡推薦使用zkw演算法求解最小費用流,看著 理解就行,應該還是很好理解的。zkw演算法在稠密圖上跑得飛快,在稀疏圖上還不...
網路流 費用流
網路流有很多種類 其中最大流 有增廣路演算法和預流推進演算法。增廣路演算法就是不斷的新增增廣路。其中的dinic演算法。會稍微提到isap演算法 poj1273 首先想到dfs一直往後延伸,然後從源點到匯點計算每條路,但是這樣只是單條路的最值,有時可能因為走一條路而間接的認定了除這條路以外的某個路通...