Pagini recente » Monitorul de evaluare | Cod sursa (job #13312) | Cod sursa (job #3227785) | Cod sursa (job #924733) | Cod sursa (job #1133388)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#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();
if(nod==n)
continue;
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()
{
int x,y,z,m;
int fmin,flow;
in>>n>>m;
while(m--)
{
in>>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;
return 0;
}