Pagini recente » Cod sursa (job #2479535) | Cod sursa (job #2058301) | Cod sursa (job #692536) | Cod sursa (job #2377124) | Cod sursa (job #1262804)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define MAX 1005
bool min(int a, int b){if(a<b)return a; return b;}
bool bfs();
queue<int> q;
vector<int> graf[MAX];
int cap[MAX][MAX], flux[MAX][MAX], viz[MAX], n, vtata[MAX];
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int m, i, a, b, c, fmin, fmax=0;
scanf("%d%d", &n, &m);
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
graf[a].push_back(b);
graf[b].push_back(a);
cap[a][b] = c;
}
while(bfs())
{
fmin = (1LL<<31)-1;
for(i=n; i!=1; i= vtata[i]){
fmin = min(fmin, cap[vtata[i]][i]-flux[vtata[i]][i]);
}
for(i=n; i!=1; i=vtata[i])
{
flux[vtata[i]][i] += fmin;
flux[i][vtata[i]] -= fmin;
}
fmax += fmin;
}
printf("%d\n", fmax);
return 0;
}
bool bfs()
{
int tata, fiu, i;
viz[1]=1;
vtata[1]=1;
while(!q.empty())q.pop();
for(i=2; i<=n; i++)viz[i]=vtata[i]=0;
q.push(1);
while(!q.empty())
{
tata = q.front();
if(tata == n)
break;
for(i=0; i<graf[tata].size(); i++)
{
fiu = graf[tata][i];
if(viz[fiu] == 0 and cap[tata][fiu]-flux[tata][fiu]>0){
q.push(fiu);
viz[fiu] = viz[tata]+1;
vtata[fiu] = tata;
}
}
q.pop();
}
if(viz[n] == 0) return 0;
return 1;
}