Pagini recente » Cod sursa (job #3214497) | Cod sursa (job #2595023)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX = 1000;
const int INF = 2.e9;
int c[NMAX + 5][NMAX + 5] , f[NMAX + 5][NMAX + 5] , viz[NMAX + 5] , n , s , t;
vector <int> G[NMAX + 5];
int bfs()
{
int u , v , j;
memset(viz , 0 , sizeof(viz));
viz[s] = -1;
queue <int> q;
q.push(s);
while(!q.empty())
{
u = q.front();
q.pop();
if(u == t)
continue;
for(j = 0 ; j < G[u].size() ; j ++)
{
v = G[u][j];
if(c[u][v] - f[u][v] > 0 && !viz[v])
{
viz[v] = u;
q.push(v);
}
}
}
if(!viz[t])
return 0;
return 1;
}
int get_flow()
{
int i , flow;
flow = INF;
i = t;
while(viz[i] != -1)
{
flow = min(flow , c[viz[i]][i] - f[viz[i]][i]);
i = viz[i];
}
return flow;
}
void set_flow(int flow)
{
int i = t;
while(viz[i] != -1)
{
f[viz[i]][i] = f[viz[i]][i] + flow;
f[i][viz[i]] = f[i][viz[i]] - flow;
i = viz[i];
}
}
int max_flow()
{
int i , j , nod , flow = 0 , fl;
while(bfs())
for(j = 0 ; j < G[t].size() ; j ++)
{
nod = G[t][j];
if(c[nod][t] - f[nod][t] == 0 || !viz[nod])
continue;
viz[t] = nod;
set_flow(get_flow());
}
for(i = 1 ; i <= n ; i ++)
flow = flow + f[s][i];
return flow;
}
int main()
{
freopen("maxflow.in" , "r" , stdin);
freopen("maxflow.out" , "w" , stdout);
int m , i , x , y , z;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= m ; i ++)
{
scanf("%d%d%d" , &x , &y , &z);
G[x].push_back(y);
G[y].push_back(x);
c[x][y] = c[x][y] + z;
}
s = 1;
t = n;
printf("%d\n" , max_flow());
return 0;
}