Pagini recente » Cod sursa (job #2025043) | Cod sursa (job #1714377) | Cod sursa (job #2058253) | Cod sursa (job #563074) | Cod sursa (job #1377983)
# include <cstdio>
# include <vector>
# include <cstring>
# define INF 2000000000
# define N 1010
# define pb push_back
# define vecin (*it)
using namespace std;
vector <int> G[N];
vector <int> :: iterator it;
int c[N][N],f[N][N];
int T[N],q[N],S,D,n,m;
bool bf()
{
int nr=0,i;
memset(T,0,sizeof(T));
q[++nr]=S;
for(i=1; i<=nr; ++i)
{
int nod=q[i];
for(vector <int> :: iterator it=G[nod].begin(); it!=G[nod].end(); ++it)
if(!T[vecin] && c[nod][vecin]>f[nod][vecin])
{
if(vecin!=D)
{
T[vecin]=nod;
q[++nr]=vecin;
}
else return true;
}
}
return false;
}
void max_flow()
{
int Max=0;
for(int flux=0; bf();)
for(it=G[D].begin(); it!=G[D].end(); ++it)
if(T[vecin] && c[vecin][D]>f[vecin][D])
{
T[D]=vecin;
int r=INF;
for(int nod=D; nod!=1; nod=T[nod])
r=min(r,c[T[nod]][nod]-f[T[nod]][nod]);
if(r<=0) continue;
Max+=r;
for(int nod=D; nod!=1; nod=T[nod])
{
f[T[nod]][nod]+=r;
f[nod][T[nod]]-=r;
}
}
printf("%d\n", Max);
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for(int i=1; i<=m; ++i)
{
int x,y,z;
scanf("%d %d %d\n", &x, &y, &z);
c[x][y]=z;
G[x].pb(y);
G[y].pb(x);
}
S=1; D=n;
max_flow();
}