Pagini recente » Cod sursa (job #2888985) | Cod sursa (job #2031726) | Cod sursa (job #676942) | Cod sursa (job #3181592) | Cod sursa (job #1202116)
#include <fstream>
#include <queue>
#include <bitset>
using namespace std;
//Dinic's Maxflow Algorithm
//Don't forget about
//#include <queue>
//#include <bitset>
//Problem specific parameters
#define MAXFLOWNMAX 1005
int maxflown,maxflows,maxflowt;
//Actual implementation
int maxflowcap[MAXFLOWNMAX][MAXFLOWNMAX];
int maxflowtata[MAXFLOWNMAX];
bitset<MAXFLOWNMAX> maxflowviz;
queue<int> maxflowcoada;
bool maxflowbfs()
{
maxflowviz&=0;
maxflowviz[maxflows]=1;
maxflowtata[maxflows]=0;
maxflowcoada.push(maxflows);
while(!maxflowcoada.empty()){
int maxflowy=maxflowcoada.front();
maxflowcoada.pop();
for(int maxflowi=1;maxflowi<=maxflown;maxflowi++)
if(maxflowcap[maxflowy][maxflowi])
if(!maxflowviz[maxflowi]){
maxflowviz[maxflowi]=1;
maxflowtata[maxflowi]=maxflowy;
maxflowcoada.push(maxflowi);
}
}
return maxflowviz[maxflowt];
}
inline int maxflow()
{
if(!maxflown) //For stability issues
return 0;
int maxflowflux=0;
while(maxflowbfs()){
for(int maxflowi=1;maxflowi<=maxflown;maxflowi++)
if(maxflowviz[maxflowi] && maxflowcap[maxflowi][maxflowt]){
int maxflowminim=maxflowcap[maxflowi][maxflowt];
int maxflownod=maxflowi;
while(maxflowtata[maxflownod]){
maxflowminim=min(maxflowminim,maxflowcap[maxflowtata[maxflownod]][maxflownod]);
maxflownod=maxflowtata[maxflownod];
}
maxflowflux+=maxflowminim;
maxflowcap[maxflowi][maxflowt]-=maxflowminim;
maxflowcap[maxflowt][maxflowi]+=maxflowminim;
maxflownod=maxflowi;
while(maxflowtata[maxflownod]){
maxflowcap[maxflowtata[maxflownod]][maxflownod]-=maxflowminim;
maxflowcap[maxflownod][maxflowtata[maxflownod]]+=maxflowminim;
maxflownod=maxflowtata[maxflownod];
}
}
}
return maxflowflux;
}
//End of Dinic's Maxflow Algorithm
//Test Code
int main()
{
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int m=0;
cin>>maxflown>>m;
int a,b,c;
while(m--){
cin>>a>>b>>c;
maxflowcap[a][b]=c;
}
maxflows=1,maxflowt=maxflown;
cout<<maxflow()<<'\n';
cin.close();
cout.close();
return 0;
}