#include<list>usingnamespacestd;inlineintmin(constinta,constintb){returna>b?b:a;}/* "Relabel to front" is one of the fastest algorithm to solve * Maximum Flow problem. This is a variation of Push-relabel algorithm. * * Jae ju, Kim * Azurespace */template<intN>classMaxFlow{staticconstintINF=0x7fffffff;intcapacity[N][N];intheight[N];intresidual[N];intindex[N];public:voidpush(intu,intv){intsend=min(capacity[u][v],residual[u]);capacity[u][v]-=send;capacity[v][u]+=send;residual[u]-=send;residual[v]+=send;}voidrelabel(intu){intv,h=height[u];for(v=0;v<N;++v){if(capacity[u][v]>0){h=min(h,height[v]);}}height[u]=h+1;}voiddischarge(intu){intv;if(residual[u]>0){while(index[u]<N){v=index[u];if(capacity[u][v]>0&&height[u]>height[v])push(u,v);++index[u];}relabel(u);index[u]=0;}}intflow(ints,inte){list<int>L;list<int>::iteratoriter;intu,prev_height;for(u=0;u<N;++u){residual[u]=0;index[u]=0;height[u]=0;}residual[s]=INF;height[s]=N;for(u=0;u<N;++u){push(s,u);L.push_back(u);}for(iter=L.begin();iter!=L.end();++iter){u=*iter;prev_height=height[u];discharge(u);if(height[u]!=prev_height){L.push_front(u);L.erase(iter);iter=L.begin();}}returnresidual[e];}};intmain(){return0;}
그냥 오랜만에 한번 짜 봤습니다
조금 고치면 실제로 사용도 가능할 겁니다. 아마도(...)
기억에 의존해서 짠 거라 틀릴지도?
Azurespace
그냥 오랜만에 한번 짜 봤습니다
조금 고치면 실제로 사용도 가능할 겁니다. 아마도(...)
기억에 의존해서 짠 거라 틀릴지도?
15년 전