Pagini recente » Cod sursa (job #476449) | Profil robertpoe | Cod sursa (job #1402617) | Cod sursa (job #1256705) | Cod sursa (job #1133366)
#include <iostream>
//#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#include <cstdio>
#define maxn 1010
#define maxm 5010
#define INF 1<<30
using namespace std;
//ifstream in("maxflow.in");
//ofstream out("maxflow.out");
vector <int> Graf[maxn];
bool viz[maxn];
int n;
int capacitate[maxn][maxn];
int flux_bagat[maxn][maxn];
int tata[maxn];
inline int minim(int a,int b)
{
return a<b ? a:b;
}
int BFS()
{
memset(viz,0,sizeof(viz));
queue <int> Q;
Q.push(1);
viz[1]=1;
vector <int> :: iterator it;
int nod;
while(!Q.empty())
{
nod=Q.front();
Q.pop();
for(it=Graf[nod].begin();it!=Graf[nod].end();it++)
{
if(capacitate[nod][*it]==flux_bagat[nod][*it] || viz[*it])
continue;
viz[*it]=1;
tata[*it]=nod;
Q.push(*it);
}
}
return viz[n];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int x,y,z,m;
int fmin,flow;
//in>>n>>m;
scanf("%d%d",&n,&m);
while(m--)
{
//in>>x>>y>>z;
scanf("%d%d%d",&x,&y,&z);
Graf[x].push_back(y);
Graf[y].push_back(x);
capacitate[x][y]=z;
}
vector <int> :: iterator it;
for(flow=0;BFS();)
for( it=Graf[n].begin();it!=Graf[n].end();it++)
{
if(capacitate[*it][n]==flux_bagat[*it][n] || !viz[*it])
continue;
tata[n]=*it;
fmin=INF;
for(int nod=n;nod!=1;nod=tata[nod])
fmin=minim(fmin,capacitate[tata[nod]][nod]-flux_bagat[tata[nod]][nod]);
if(fmin==0)
continue;
for(int nod=n;nod!=1;nod=tata[nod])
{
flux_bagat[tata[nod]][nod]+=fmin;
flux_bagat[nod][tata[nod]]-=fmin;
}
flow+=fmin;
}
//out<<flow;
printf("%d",flow);
return 0;
}