Pagini recente » Cod sursa (job #1995839) | Cod sursa (job #261658) | Cod sursa (job #779937) | Cod sursa (job #1930785) | Cod sursa (job #1464438)
#include <iostream>
#include <stdio.h>
#include <deque>
#include <vector>
#define NMax 1001
using namespace std;
int N,M,Cap[NMax][NMax],flux[NMax][NMax],t[NMax],sol;
bool uz[NMax];
deque<int> Q;
vector<int> Graf[NMax];
int BFS()
{
for(int i=1;i<=N;i++)
t[i]=uz[i]=0;
Q.push_back(1);
while(!Q.empty())
{
int nod=Q.front();
Q.pop_front();
for(vector<int>::iterator it=Graf[nod].begin();it!=Graf[nod].end();it++)
{
int vecin=*it;
if(Cap[nod][vecin]>flux[nod][vecin] && uz[vecin]==false)
{
uz[vecin]=true;
Q.push_back(vecin);
t[vecin]=nod;
}
}
}
return uz[N];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=M;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Graf[x].push_back(y);
Graf[y].push_back(x);
Cap[x][y]=z;
}
while(BFS())
{
for(int i=1;i<=N;i++)
{
if(Cap[i][N]>flux[i][N] && t[i])
{
int fmin=Cap[i][N]-flux[i][N];
for(int j=i;j!=1;j=t[j])
fmin=min(fmin,(Cap[t[j]][j]-flux[t[j]][j]));
for(int j=i;j!=1;j=t[j])
{
flux[t[j]][j]=flux[t[j]][j]+fmin;
flux[j][t[j]]=flux[j][t[j]]-fmin;
}
flux[i][N]+=fmin;
flux[N][i]-=fmin;
sol=sol+fmin;
}
}
}
printf("%d",sol);
}