Pagini recente » Cod sursa (job #907283) | Cod sursa (job #1477616) | Cod sursa (job #1809917) | Cod sursa (job #2436985) | Cod sursa (job #708779)
Cod sursa(job #708779)
#include <fstream>
#include <vector>
#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,C[MaxN][MaxN],F[MaxN][MaxN],x,y,c,T[MaxN],Q[MaxN];
vector<int> G[MaxN];
inline bool BFS()
{
bool ok=false;
int V[MaxN];
memset(V,0,sizeof(V));
int p,u;
p=0;
u=-1;
Q[++u]=1;
V[1]=1;
while(p<=u)
{
int nod=Q[p];
++p;
for(vector<int>::iterator it=G[nod].begin();it!=G[nod].end();++it)
{
if(C[nod][*it]>F[nod][*it])
{
if(*it==N)
{
ok=true;
continue;
}
if(!V[*it])
{
T[*it]=nod;
V[*it]=1;
Q[++u]=*it;
}
}
}
}
return ok;
}
//0232211826
inline int maxflow()
{
int flux=0;
while(BFS())
{
for(vector<int>::iterator it=G[N].begin();it!=G[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];
}
flux+=minim;
}
}
return flux;
}
int main()
{
fin>>N>>M;
for(register int i=1;i<=M;++i)
{
fin>>x>>y>>c;
C[x][y]=c;
G[x].push_back(y);
G[y].push_back(x);
}
fin.close();
fout<<maxflow();
fout.close();
return 0;
}