Pagini recente » Cod sursa (job #1428294) | Cod sursa (job #1173596) | Cod sursa (job #810437) | Cod sursa (job #1834441) | Cod sursa (job #2362322)
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define maxN 1010
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
vector <int> g[maxN];
int flux, S, D, m, n, x, y, i, c[maxN][maxN], f[maxN][maxN], T[maxN];
int bfs()
{
int ok=0;
queue <int> q;
T[S]=-1;
q.push(S);
while( !q.empty() )
{
int nod = q.front();
for(auto it : g[nod])
if(T[it] == 0 && c[nod][it] > f[nod][it])
{
if(it != D)
{
T[it] = nod;
q.push(it);
}
else ok = 1;
}
q.pop();
}
return ok;
}
void dinitz()
{
int drum = bfs();
int nod, minn, i;
while( drum )
{
for(auto it : g[D])
{
if( T[it]!=0 && c[it][D] > f[it][D])
{
minn = 999999999;
T[D] = it;
for(nod=D; nod!=S; nod=T[nod])
if( minn > c[T[nod]][nod]-f[T[nod]][nod] )
minn = c[T[nod]][nod]-f[T[nod]][nod];
if(minn > 0)
{
flux += minn;
for(nod = D; nod != S; nod = T[nod])
{
f[T[nod]][nod] += minn;
f[nod][T[nod]] -= minn;
}
}
}
}
for(i=1;i<=maxN;i++)
T[i]=0;
drum = bfs();
}
}
int main()
{
fin >> n >> m ;
for(i=1;i<=m;i++)
{
fin >> x >> y;
fin >> c[x][y];
g[x].push_back(y);
g[y].push_back(x);
}
S=1; D=n;
dinitz();
fout<<flux<<'\n';
fin.close();
fout.close();
return 0;
}