Pagini recente » Cod sursa (job #2197436) | Cod sursa (job #2948983) | Cod sursa (job #1854481) | Cod sursa (job #1071167) | Cod sursa (job #1474063)
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <vector>
#include <queue>
#define INF 1<<30
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
typedef struct arc{
int cap, flow, s, t;
arc *rev;
} Edge, *AEdge;
int N, M, source, dest, maxflow = 0;
vector< vector<AEdge> > graph;
void read(){
in >> N >> M;
source = 1;
dest = N;
for(int i = 0; i <= N; ++i){
vector<AEdge> v;
graph.push_back(v);
}
int x, y, c;
for(int i = 0; i < M; ++i){
in >> x >> y >> c;
//creem un edge
AEdge e = (AEdge)malloc(sizeof(Edge));
AEdge e1 = e;
e->s = x;
e->t = y;
e->cap = c;
e->flow = 0;
AEdge r = (AEdge)malloc(sizeof(Edge));
AEdge r1 = r;
r->s = y;
r->t = x;
r->cap = 0;
r->flow = 0;
r->rev = e;
e->rev = r;
graph[x].push_back(e);
}
}
void EdmondsKarp(){
while(1){
queue<int> Q;
Q.push(source);
vector<AEdge> pred(N+1);
while(!Q.empty()){
int u = Q.front();
Q.pop();
for(unsigned int i = 0; i < graph[u].size(); ++i){
AEdge e = graph[u][i];
if(pred[(*e).t] == NULL && (*e).t != source && (*e).cap > (*e).flow){
pred[(*e).t] = e;
Q.push((*e).t);
}
}
}
if(pred[dest] == NULL){
break;
}
int df = INF;
for(AEdge e = pred[dest]; e != NULL; e = pred[(*e).s]){
df = min(df, (*e).cap - (*e).flow);
}
for(AEdge e = pred[dest]; e != NULL; e = pred[(*e).s]){
(*e).flow = (*e).flow + df;
((*e).rev)->flow = ((*e).rev)->flow - df;
}
maxflow = maxflow + df;
}
}
int main(){
read();
EdmondsKarp();
out << maxflow;
}