Pagini recente » Cod sursa (job #2390750) | Cod sursa (job #446186) | Cod sursa (job #2386065) | Cod sursa (job #2616863) | Cod sursa (job #562467)
Cod sursa(job #562467)
#include <fstream>
#include <list>
#include <queue>
#include <cstring>
using namespace std;
const char InFile[]="maxflow.in";
const char OutFile[]="maxflow.out";
const int MaxN=1024;
const int INF=1<<30;
ifstream fin(InFile);
ofstream fout(OutFile);
int N,M,maxflow,x,y,z,C[MaxN][MaxN],F[MaxN][MaxN],T[MaxN];
list<int> A[MaxN];
inline bool BFS()
{
bool ok=false;
int V[MaxN];
memset(V,0,sizeof(V));
V[1]=1;
queue<int> q;
q.push(1);
while(!q.empty())
{
int nod=q.front();
q.pop();
V[nod]=1;
for(list<int>::iterator it=A[nod].begin();it!=A[nod].end();++it)
{
if(*it==N)
{
ok=true;
continue;
}
if(!V[*it] && C[nod][*it]>F[nod][*it])
{
T[*it]=nod;
q.push(*it);
}
}
}
return ok;
}
inline int flux()
{
int flow=0;
while(BFS())
{
for(list<int>::iterator it=A[N].begin();it!=A[N].end();++it)
{
int nod=*it;
int minim=C[nod][N]-F[nod][N];
while(nod!=1)
{
minim=min(minim,C[T[nod]][nod]-F[T[nod]][nod]);
nod=T[nod];
}
nod=*it;
F[nod][N]+=minim;
F[N][nod]-=minim;
while(nod!=1)
{
F[T[nod]][nod]+=minim;
F[nod][T[nod]]-=minim;
nod=T[nod];
}
flow+=minim;
}
}
return flow;
}
int main()
{
fin>>N>>M;
for(register int i=1;i<=M;++i)
{
fin>>x>>y>>z;
C[x][y]=z;
A[x].push_back(y);
A[y].push_back(x);
}
fin.close();
maxflow=flux();
fout<<maxflow;
fout.close();
return 0;
}