Pagini recente » Cod sursa (job #2057703) | Cod sursa (job #890087) | Cod sursa (job #931879) | Cod sursa (job #1569419) | Cod sursa (job #608737)
Cod sursa(job #608737)
#include<stdio.h>
#include<queue>
#include<vector>
#define NMAX 1<<10
using namespace std;
vector<int> L[NMAX];
int C[NMAX][NMAX],F[NMAX][NMAX],dad[NMAX];
bool used[NMAX];
bool BFS(int N)
{
int now,i;
queue<int> Q;
vector<int> :: iterator it;
for(i=1;i<=N; i++)
{
used[i] = 0;
dad[i] = -1;
}
Q.push(1); used[1] = 1;
while(!Q.empty())
{
now = Q.front();
for( it = L[now].begin(); it != L[now].end() ; it ++)
if(!used[*it] && F[now][*it] < C[now][*it])
{
used[*it] = 1;
dad[*it] = now;
Q.push(*it);
}
Q.pop();
}
return used[N];
}
int main()
{
int N,M,i,x,y,cost, maxFlow = 0 , flow , now;
vector<int> :: iterator it;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&N,&M);
for(i=1;i<=M;i++)
{
scanf("%d%d%d",&x,&y,&cost);
L[x].push_back(y);
L[y].push_back(x);
C[x][y] = cost;
}
while(BFS(N))
{
for(it = L[N].begin(); it != L[N].end(); it++)
if(F[*it][N] < C[*it][N] && used[*it])
{
now = *it ;
flow = C[*it][N] - F[*it][N];
while (now != 1)
{
if( flow > C[dad[now]][now] - F[dad[now]][now])
flow = C[dad[now]][now] - F[dad[now]][now];
now = dad [now];
}
if(flow > 0)
{
maxFlow = maxFlow + flow;
now = *it ;
F[*it][N] = F[*it][N] + flow;
F[N][*it] = F[N][*it] - flow;
while (now != 1)
{
F[dad[now]][now] = F[dad[now]][now] + flow;
F[now][dad[now]] = F[now][dad[now]] - flow;
now = dad [now];
}
}
}
}
printf("%d",maxFlow);
return 0;
}