Pagini recente » Cod sursa (job #846388) | Cod sursa (job #1063902) | Cod sursa (job #380820) | Cod sursa (job #545557) | Cod sursa (job #599771)
Cod sursa(job #599771)
#include <fstream>
#include <cstring>
#include <vector>
#define X1 1001
#define INF 0x7fffffff
using namespace std;
ifstream in;
ofstream out;
vector <int> v[X1];
int C[X1][X1],F[X1][X1];
int use[X1],T[X1],q[X1];
int N,ind;
inline void bf(int nod)
{
for(vector <int>::iterator it=v[nod].begin();it!=v[nod].end();++it)
if(!use[*it])
if(C[nod][*it]>F[nod][*it])
{
use[*it]=1;
T[*it]=nod;
q[++q[0]]=*it;
}
if(ind<=q[0])
{
nod=q[ind++];
if(nod!=N) bf(nod);
else
if(ind<=q[0])
{
nod=q[ind++];
bf(nod);
}
}
}
int main()
{
int M,x,y,flux=0,min;
memset(C,0,sizeof(C));
memset(F,0,sizeof(F));
in.open("maxflow.in");
in>>N>>M;
for(;M;--M)
{
in>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
in>>C[x][y];
}
in.close();
while(1)
{
memset(T,0,sizeof(T));
memset(use,0,sizeof(use));
memset(q,0,sizeof(q));
use[1]=1;
ind=1;
bf(1);
if(!use[N]) break;
for(vector <int>::iterator it=v[N].begin();it!=v[N].end();++it)
if(C[*it][N]>F[*it][N]&&use[*it])
{
T[N]=*it;
min=INF;
x=N;
while(x!=1)
{
if(min>C[T[x]][x]-F[T[x]][x]) min=C[T[x]][x]-F[T[x]][x];
x=T[x];
}
if(min>0)
{
x=N;
while(x!=1)
{
F[T[x]][x]+=min;
F[x][T[x]]-=min;
x=T[x];
}
flux+=min;
}
}
}
out.open("maxflow.out");
out<<flux<<'\n';
out.close();
return 0;
}