Pagini recente » Cod sursa (job #2671450) | Cod sursa (job #2039859) | Cod sursa (job #2944320) | Cod sursa (job #1656457) | Cod sursa (job #2565996)
#include <bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,flow;
vector<vector<int>> a(1001,vector<int>());
int C[1001][1001];
int cd[1001],TT[1001];
bool viz[1001];
int F[1001][1001];
void Citire()
{
int x,y,capacitate;
f>>n>>m;
for(int i=1;i<=m;++i)
{
f>>x>>y>>capacitate;
C[x][y] = capacitate;
a[x].push_back(y);
a[y].push_back(x);
}
}
bool BFS()
{
int nod, V;
memset(viz,false,sizeof viz);
cd[0] = cd[1] = 1;
queue<int> s;
s.push(1);
viz[1] = true;
while(!s.empty())
{
int nod = s.front();
s.pop();
if(nod == n) continue;
for(vector<int>::iterator it=a[nod].begin();it!=a[nod].end();++it)
{
int V = *it;
if(C[nod][V] == F[nod][V] || viz[V]) continue;
viz[V] = true;
s.push(V);
TT[V] = nod;
}
}
return viz[n];
}
int main()
{
int nod,fmin;
Citire();
for(;BFS();)
for(vector<int>::iterator it=a[n].begin();it!=a[n].end();++it)
{
nod = *it;
if(C[nod][n] == F[nod][n] || !viz[nod]) continue;
TT[n] = nod;
fmin = INFINITY;
for(nod = n ; nod != 1 ; nod = TT[nod])
fmin = min(C[TT[nod]][nod] - F[TT[nod]][nod],fmin);
if(fmin == 0) continue;
for(nod = n; nod != 1 ; nod = TT[nod])
{
F[TT[nod]][nod] += fmin;
F[nod][TT[nod]] -= fmin;
}
flow += fmin;
}
g<<flow;
return 0;
}