Pagini recente » Cod sursa (job #508882) | Cod sursa (job #354882) | Cod sursa (job #1902638) | Cod sursa (job #2920926) | Cod sursa (job #1212203)
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
#define NMAX 1002
#define INF 200000000
int n,m,sol;
int t[NMAX],f[NMAX][NMAX],val[NMAX];
vector<int>v[NMAX];
struct cmp
{
bool operator()(const int &a,const int &b)
{
return val[a]>val[b];
}
};
priority_queue<int,vector<int>, cmp>q;
bool drum()
{
int i,nod,fiu;
while(!q.empty())
q.pop();
memset(t,0,sizeof(t));
memset(val,0,sizeof(val));
t[1]=1;
val[1]=1;
nod=1;
q.push(nod);
while(!q.empty())
{
nod=q.top();
q.pop();
for(i=0;i<v[nod].size();++i)
{
fiu=v[nod][i];
if(f[fiu][nod] && !t[fiu] && (val[fiu]==0 || val[fiu]>val[nod]+1))
{
t[fiu]=nod;
val[fiu]=val[nod]+1;
if(fiu==n)
return 1;
q.push(fiu);
}
}
}
return 0;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int i,maxc,x,y,c;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&c);
v[x].push_back(y);
v[y].push_back(x);
f[y][x]=c;
}
while(drum())
{
maxc=INF;
for(i=n;i!=1;i=t[i])
if(f[i][t[i]]<maxc)
maxc=f[i][t[i]];
for(i=n;i!=1;i=t[i])
{
f[i][t[i]]-=maxc;
f[t[i]][i]+=maxc;
}
sol+=maxc;
}
printf("%d\n",sol);
return 0;
}