Pagini recente » Cod sursa (job #3211696) | Cod sursa (job #1318907) | Cod sursa (job #2326498) | Cod sursa (job #941599) | Cod sursa (job #1061406)
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int MAXN=1005;
const int INF=(1<<30)-1;
int n,m,lg,MAX_FLOW;
int mark[MAXN],capacity[MAXN][MAXN],flow[MAXN][MAXN];
vector<int> g[MAXN];
queue<int> q;
int l[MAXN];
void read()
{
int x,y,c;
freopen("maxflow.in","r",stdin);
scanf("%d%d",&n,&m);
for (int i=1; i<=m; ++i)
{
scanf("%d%d%d",&x,&y,&c);
g[x].push_back(y);
capacity[x][y]=c;
}
}
void write()
{
freopen("maxflow.out","w",stdout);
printf("%d\n",MAX_FLOW);
}
void create_link()
{
lg=0;
int u=1,v=0,i=0;
if (mark[n])
v=n;
while (v)
{
++lg;
v=mark[v];
}
for (i=lg, v=n; i>=1 && v!=0; v=mark[v], --i)
{
l[i]=v;
}
}
void increment_flow()
{
int i=0,inc=INF;
for (i=1; i<lg; ++i)
inc=min(inc,capacity[l[i]][l[i+1]]-flow[l[i]][l[i+1]]);
if (inc==INF)
return;
for (i=1; i<=lg; ++i)
flow[l[i]][l[i+1]]+=inc;
MAX_FLOW+=inc;
for (i=1; l[i]!=0; l[i]=0, ++i);
}
void bfs()
{
for (int i=1; i<=n; mark[i]=0, ++i);
int u=0;
q.push(1);
while (!q.empty())
{
u=q.front();
q.pop();
for (vector<int>::iterator v=g[u].begin(); v!=g[u].end(); ++v)
{
if (!mark[*v] && flow[u][*v]<capacity[u][*v])
{
mark[*v]=u;
q.push(*v);
}
}
}
}
void ek()
{
do
{
bfs();
create_link();
increment_flow();
}
while (mark[n]);
}
int main()
{
read();
ek();
write();
return 0;
}