Pagini recente » Cod sursa (job #422435) | Cod sursa (job #2048144) | Cod sursa (job #2065233) | Cod sursa (job #2046943) | Cod sursa (job #1593348)
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define DMAX 1001
vector<int> v[DMAX];
int C[DMAX][DMAX], F[DMAX][DMAX];
bool viz[DMAX];
queue<int> q;
int n, m, x, y, z, flow;
int T[DMAX];
void read()
{
freopen("maxflow.in", "r", stdin);
scanf("%d %d", &n, &m);
for(int i=0; i<m; i++)
{
scanf("%d %d %d", &x, &y, &z);
v[x].push_back(y);
v[y].push_back(x);
C[x][y]=z;
}
}
bool bfs()
{
for(int i=1; i<=n; i++) viz[i]=0;
q.push(1);
viz[1]=1;
while(!q.empty())
{
int nod=q.front();
q.pop();
for(vector <int>::iterator it = v[nod].begin(); it!=v[nod].end(); it++)
{
if(F[nod][*it]<C[nod][*it]&&!viz[*it])
{
q.push(*it);
T[*it]=nod;
viz[*it]=1;
}
}
}
return viz[n];
}
int main()
{
read();
while(bfs())
{
for(vector<int>::iterator it=v[n].begin(); it!=v[n].end(); ++it)
{
if(viz[*it]&&F[*it][n]<C[*it][n])
{
int minflow=C[*it][n]-F[*it][n];
int node=*it;
while(T[node]!=0)
{
if(minflow>C[T[node]][node]-F[T[node]][node]) minflow=C[T[node]][node]-F[T[node]][node];
node=T[node];
}
flow+=minflow;
node=*it;
F[node][n]+=minflow;
F[n][node]-=minflow;
while(T[node]!=0)
{
F[T[node]][node]+=minflow;
F[node][T[node]]-=minflow;
node=T[node];
}
}
}
}
freopen("maxflow.out","w",stdout);
printf("%d",flow);
}