Pagini recente » Cod sursa (job #3223405) | Cod sursa (job #3273457) | Cod sursa (job #1005322) | Rezultatele filtrării | Cod sursa (job #2444309)
#include <cstdio>
#include <deque>
#include <vector>
#include <cstring>
#include <algorithm>
#define DIMN 1010
#define INF 2000000000
using namespace std;
deque <int> dq;
vector <pair <int,int> > v[DIMN];
int dist[DIMN],cap[DIMN][DIMN],n,start[DIMN];
int bfs (){
int nod,i,vecin;
dq.push_back(1);
memset (dist , 0 , sizeof(dist));
dist[1] = 1;
while (!dq.empty()){
nod = dq.front();
dq.pop_front();
for ( i=0 ; i<v[nod].size() ; i++ ){
vecin = v[nod][i].first;
if (!dist[vecin] && cap[nod][vecin]){
dist[vecin] = dist[nod] + 1;
dq.push_back(vecin);
}
}
}
if (dist[n] == 0)
return 0;
return 1;
}
int dfs (int nod , int flow){
int vecin,sol;
if (nod == n || !flow)
return flow;
for (;start[nod] < v[nod].size() ; start[nod]++){
vecin = v[nod][start[nod]].first;
if (dist[nod] + 1 == dist[vecin] && cap[nod][vecin]>=0){
sol = dfs (vecin , min(flow , cap[nod][vecin]));
if (sol > 0){
cap[nod][vecin]-=sol;
cap[vecin][nod]+=sol;
return sol;
}
}
}
return 0;
}
int main()
{
FILE *fin = fopen ("maxflow.in","r");
FILE *fout = fopen ("maxflow.out","w");
int m,x,y,z,mflow,flow,i;
fscanf (fin,"%d%d",&n,&m);
for (i=1;i<=m;i++){
fscanf (fin,"%d%d%d",&x,&y,&z);
cap[x][y] = z;
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,0));
}
mflow = 0;
while (bfs()){
memset (start , 0, sizeof(start));
flow = dfs (1,INF);
while (flow > 0){
mflow += flow;
flow = dfs(1,INF);
}
}
fprintf (fout,"%d",mflow);
return 0;
}