序:
在之前的文章中實現了不利用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...