Pagini recente » Cod sursa (job #691924) | Cod sursa (job #2389460) | Cod sursa (job #2475945) | Cod sursa (job #2941864) | Cod sursa (job #1259836)
# include <cstdio>
# include <vector>
# include <cstring>
# include <algorithm>
# define N (1<<10)
# define frunza (*it)
# define pb push_back
# define INF 1000000000
using namespace std;
int n,m,nod;
int T[N],Q[N];
int C[N][N],F[N][N];
vector <int> G[N];
vector <int> :: iterator it;
bool bf()
{
int i,nod;
vector <int> :: iterator it;
memset(T, 0, sizeof(T));
Q[0]=Q[1]=1;
T[1]=-1;
for(i=1; i<=Q[0]; ++i)
{
nod=Q[i];
for(it=G[nod].begin(); it!=G[nod].end(); ++it)
if(!T[frunza] && (C[nod][frunza]>F[nod][frunza]))
{
T[frunza]=nod;
Q[++Q[0]]=frunza;
if(frunza==n) return true;
}
}
return false;
}
void load()
{
int i,x,y,z;
scanf("%d %d\n", &n, &m);
for(i=1; i<=m; ++i)
{
scanf("%d %d %d\n", &x, &y, &z);
C[x][y]=z;
G[x].pb(y);
G[y].pb(x);
}
return;
}
void solve()
{
int flux,r;
for(flux=0; bf();)
for(it=G[n].begin(); it!=G[n].end(); ++it)
if(T[frunza] && C[frunza][n]>F[frunza][n])
{
T[n]=frunza;
r=INF;
for(nod=n; nod!=1; nod=T[nod])
r=min(r, C[T[nod]][nod]-F[T[nod]][nod]);
if(r<=0) continue;
flux+=r;
for(nod=n; nod!=1; nod=T[nod])
{
F[T[nod]][nod]+=r;
F[nod][T[nod]]-=r;
}
}
printf("%d\n", flux);
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
load();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}