Pagini recente » Cod sursa (job #2053275) | Cod sursa (job #2511953) | Cod sursa (job #1082466) | Cod sursa (job #2227402) | Cod sursa (job #2422005)
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int c[1001][1001],p[1001];
bool viz[1001];
vector<int>g[1001];
queue<int>q;
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int n,m,i,x,y,z,maxflow=0;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
if(!c[x][y]&&!c[y][x])
{
g[x].push_back(y);
g[y].push_back(x);
}
c[x][y]+=z;
}
while(1)
{
memset(p,0,sizeof(p));
memset(viz,0,sizeof(viz));
q.push(1);
viz[1]=true;
while(q.size())
{
int top=q.front();
q.pop();
for(i=0;i<g[top].size();++i)
{
if(c[top][g[top][i]]>0&&!viz[g[top][i]])
{
if(g[top][i]!=n)
{
p[g[top][i]]=top;
q.push(g[top][i]);
}
viz[g[top][i]]=true;
}
}
}
if(!viz[n])
break;
for(i=0;i<g[n].size();++i)
{
int neigh=g[n][i];
if(viz[neigh]&&c[neigh][n])
{
int flow=c[neigh][n],poz=neigh;
while(poz!=1)
{
flow=min(flow,c[p[poz]][poz]);
poz=p[poz];
}
poz=neigh;
c[neigh][n]-=flow;
c[n][neigh]+=flow;
while(poz!=1&&flow>0)
{
c[p[poz]][poz]-=flow;
c[poz][p[poz]]+=flow;
poz=p[poz];
}
maxflow+=flow;
}
}
}
printf("%d\n",maxflow);
return 0;
}