vector實現最大流EK演算法

2022-05-16 21:19:55 字數 1660 閱讀 3299

序:

在之前的文章中實現了不利用stl實現ek演算法,效率也較高。這次我們企圖簡化**,減少變數的使用與手寫模擬的**。

注意:vector等stl的container在不開o2優化的時候實現同乙個效果普遍比手寫要慢。

源**如下:

/*

about: max_flow_ek_vector

auther: kongse_qi

date:2017/04/22

*/#include

#define inf 0x3f3f3f

#define maxn 20005

#define maxm 200005

#define g_t get_int()

#define p_b(x) push_back(x)

#define read(x) g_t, x = in

using

namespace

std;

/* 部分巨集是為了簡潔好看 */

struct edge

edge(int f, int t, int w):

from(f), to(t), weight(w){}

};//邊表

vector

edge;//存所有弧的資訊

vector

arc[maxn];//每個節點相連的弧的編號

typedef

vector

::iterator iterator_t;//迭代器

int n, m, st, en, max_flow;

iterator_t pre[maxn];//記錄上一條弧的編號便於回溯

char *x, *t, *buffer, c;//讀入優化

int in;

bool flag = true;

void get_all()

void get_int()

return ;

}void init()//當多組資料的時候

max_flow = 0;

return ;

}void add_edge(int st, int en, int weight)

void read()

return ;

}bool bfs(int st, int en)}}

return

false;

}void ek(int st, int en)

for(unsigned i = en; i != st; i = edge[*pre[i]].from)

max_flow += minn;

}return ;

}int main()

基本意思與非vector實現時是一樣的。

效率:非常慢!比非vector實現的要慢1倍,要不是讀入優化比較狠肯定要超時。

建議oi比賽的時候不使用stl容器,除非使用例如map等極難手寫實現的容器。

不然就等著後面的大資料tle吧。

箜瑟_qi 2017.04.22 22:14

最大流 EK演算法

ek演算法。特別暴力 時間複雜度o v e 2 所以競賽中我們一般用效率更高的dinic演算法 ek演算法核心就是殘量網路圖,殘量指的就是每條路上剩餘的流量。不難發現,只要能在殘量網路圖上找到一條從源點到匯點的路,就能在這一條路上加流量,所加的流量就是在這條路徑上每條邊殘量取個min,一點一點的加就...

最大流 EK演算法

ek演算法是求最大流的一種容易實現 易懂的演算法。ek演算法仍然是乙個基於增廣路的演算法,思路非常簡單。每次從s嘗試找到一條到達t的路徑,路徑上最小的殘留量大於0,那麼我們就可以把這條路上的最小殘留量減去,累加到ans裡。繼續bfs直到找不到位置,此時ans就是最大流。ek增廣路演算法的時間複雜度為...

最大流EK演算法模板

include ek 演算法。時間複雜度 ve 2 include includeusing namespace std const int maxn 100 const int inf 1 30 1 int g maxn maxn int flow maxn pre maxn bool vis m...