Introducere
Page 1 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Prezentare
Page 2 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
“debitului maxim” (max flow). Procedeul prin care se determina debitul maxim
este relativ simplu:
Principala probleama care apare este alegerea unui drum (augmenting path)
de la S la P si in aceast sens exista mai multe metode de alegere a lui. Fie p un
drum de la S la P. Se numeste capacitate reziduala a lui p maximul de unitati de
flux pe care le putem introduce pe drumul p, adica cf(p)=min(cf(u,v) | (u,v) ∈ p}.
Sa presupunem ca avem reteaua de transport din figura 2 si ne propunem sa gasim
fluxul maxim care poate traverseaza reteaua de la nodul 1 la nodul 6.
Page 3 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Fig. 2
Page 4 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Page 5 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
tip: Nod
domeniu: int
operatori
NewNod: → Nod
IsSelected: Nod → boolean
IsMark:Nod → boolean
axiome
selected(U)=IsSelected(U)
mark(U)=IsMark(U)
tip: Edge
domeniu: int, int
operatori:
NewEdge: int x int → Edge
GetCapacity: int x int → int
GetFlow: int x int → int
IsSelected: int x int → boolean
IsMark → boolean
SetCapacity: int x int x int → int
axiome
selected(U)=IsSelected(U)
mark(U)=IsMark(U)
Capacity(L)=GetCapacity(L)
Flow(L)=GetFlow(L)
Exist(L)=(Capacity(L)>0)
Page 6 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Complexitate
Page 7 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Demonstrarea corectitudinii
Page 8 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Demonstratie:
Demonstratie:
“⇒”
Presupunem ca avem p o cale marita s, u1, u2, …,
d si cp capacitatea sa reziduala. Definim urmatorul flux in
graful G:
fr (ui,ui+1)=cp
fr (ui+1,ui)=-cp, pentru 0<=i<n
fr (u,v)=0, in rest
“⇐”
Presupunem ca exista un alt flux fm cu |fm|>|f|.
Atunci exista fr astfel incat fm=fr+f. Conform lemei,
Page 9 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Page 10 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Pseudocod
Page 11 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Page 12 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Sursa JAVA
import java.util.*;
import java.awt.*;
import java.applet.Applet;
////////////////
// class Node //
////////////////
class Node {
int x;
int y;
boolean selected = false;
boolean mark = false;
////////////////
// class Edge //
////////////////
class Edge {
int capacity = 0;
boolean selected = false;
final static int min = 1, max = 99;
int flow = 0;
boolean mark = false;
boolean exist() {
return (capacity > 0);
}
Page 13 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
capacity = 1;
} else capacity = newcap;
if (flow > capacity) flow = capacity;
}
void set() {
capacity = (int)(Math.random()*max);
}
int get() {
return capacity;
}
void remove() {
capacity = 0;
}
}
////////////////
// class Mode //
////////////////
class Mode {
final static int run = 1;
final static int edit = 2;
//////////////////////
// class GraphPanel //
//////////////////////
class GraphPanel extends Panel {
Graph parent;
int nnodes=0;
int MaxNode = 100;
Node nodes[] = new Node[MaxNode];
int source = 1, sink = 2, maxflow=0;
int nedges;
Edge edges[][] = new Edge[MaxNode][MaxNode];
int mode = Mode.edit;
Page 14 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
GraphPanel(Graph parent) {
this.parent = parent;
int i, j;
for (i=1;i<MaxNode;i++)
for (j=1;j<MaxNode;j++)
edges[i][j] = new Edge();
}
void reset() {
int i, j;
for (i=1;i<MaxNode;i++)
for (j=1;j<MaxNode;j++) {
edges[i][j].capacity=0;
edges[i][j].selected=false;
edges[i][j].flow=0;
edges[i][j].mark=false;
}
nnodes=0;
Page 15 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Edge e;
nodes[u].mark = true;
nodes[u].mark = false;
return res;
}
void initFlow() {
maxflow=0;
parent.flowlabel.setText("
maxflow:"+String.valueOf(maxflow));
for (int i = 1; i<= nnodes; i++)
for (int j = 1; j <= nnodes; j++)
edges[i][j].flow = 0;
}
void removeEdgeMarks(){
for (int i = 1; i<= nnodes; i++)
for (int j = 1; j <= nnodes; j++)
edges[i][j].mark = false;
}
Page 16 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
parent.flowlabel.setText("
maxflow:"+String.valueOf(maxflow));
repaint();
}
parent.flowlabel.setText("
maxflow:"+String.valueOf(maxflow));
repaint();
}
Image offscreen;
Dimension offscreensize;
Graphics offgraphics;
Page 17 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
int r = 20;
g.setColor(nodeColor);
if (n==source) g.setColor(sourceColor);
if (n==sink) g.setColor(sinkColor);
if (nodes[n].selected) g.setColor(nodeSelectedColor);
int w = fm.stringWidth(String.valueOf(n));
int h = fm.charWidth('M');
r = h*2;
g.fillOval(x-r/2,y-r/2,r,r);
g.setColor(Color.black);
g.drawOval(x-r/2,y-r/2,r-1,r-1);
g.setColor(numColor);
g.drawString(String.valueOf(n), x - w/2, y+h/2);
}
if (edges[from][to].selected) g.setColor(edgeSelectedColor);
else if (edges[from][to].mark &&
mode==Mode.run) g.setColor(augmColor);
else
g.setColor(edgeColor);
g.drawLine(x1,y1,x2,y2);
double d = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double cosa = 1, sina = 0;
if (d != 0) {
cosa = (x2-x1) / d;
sina = (y2-y1) / d;
}
int r = 2*fm.charWidth('M');
int b_x = x2 - (int)(0.5+ r/2*cosa);
int b_y = y2 - (int)(0.5+ r/2*sina);
Page 18 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
g.drawString(String.valueOf(edges[from][to].flow)+"/"+String.valueOf(ed
ges[from][to].get()),(x1+x2)/2,(y1+y2)/2);
}
offgraphics.setColor(getBackground());
offgraphics.fillRect(0, 0, d.width, d.height);
FontMetrics fm = offgraphics.getFontMetrics();
g.setColor(edgeColor);
for (int i = 1 ; i <= nnodes ; i++)
for (int j = 1 ; j <= nnodes ; j++)
if (edges[i][j].exist()) paintEdge(offgraphics,i,j,fm);
for (int i = 1 ; i <= nnodes ; i++) paintNode(offgraphics, i, fm);
g.drawImage(offscreen, 0, 0, null);
}
Node pickNode;
Page 19 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
pickNode = n;
bestdist = dist;
}
}
if (bestdist <= 12*12) {
pickNode.x = x;
pickNode.y = y;
pickNode.selected = true;
return true;
} else {
pickNode = null;
return false;
}
}
Page 20 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
nnodes--;
sink--;
return true;
} else {
return false;
}
}
Page 21 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
boolean inner(int x1, int x2, int y1, int y2, int x, int y) {
return (((x-x1)*(x-x2) <= 0 ) && ((y-y1)*(y-y2) <= 0));
}
if (bestdist <= 5) {
edges[picki][pickj].remove();
return true;
} else return false;
}
Page 22 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
y1 = nodes[i].y;
x2 = nodes[j].x;
y2 = nodes[j].y;
a = y1 - y2;
b = x2 - x1;
c = x1*y2 - x2*y1;
if ((edges[i][j].exist()) && (a*a +b*b != 0) &&
inner((int)x1, (int)x2, (int)y1, (int)y2, x, y)) {
double dist = Math.abs(a*x + b*y
+c)/Math.sqrt(a*a+b*b);
if (dist < bestdist) {
picki = i;
pickj = j;
bestdist = dist;
pickEdge = edges[picki][pickj];
}
}
}
if (bestdist <= 5) {
if (oldPickEdge != null) oldPickEdge.selected = false;
pickEdge.selected = true;
parent.cap.setValue(pickEdge.get());
parent.caplabel.setText(String.valueOf(pickEdge.get()));
return true;
} else return false;
}
Page 23 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
return true;
repaint();
return true;
}
switch (demono){
case 0: addNode(200,50);
addNode(50,150);
addNode(350,150);
addNode(200,250);
addEdge(1,2,50);
addEdge(1,3,50);
addEdge(2,4,50);
addEdge(3,4,50);
addEdge(2,3,1);
Page 24 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
source=1;
sink=4;
break;
case 1: addNode(50,200);
addNode(100,80);
addNode(200,40);
addNode(250,300);
addNode(350,170);
addEdge(1,2,5);
addEdge(2,3,4);
addEdge(3,5,9);
addEdge(1,5,6);
addEdge(1,4,5);
addEdge(4,5,7);
addEdge(3,4,8);
source=1;
sink=5;
break;
case 2: addNode(200,25);
addNode(100,125);
addNode(300,125);
addNode(100,225);
addNode(300,225);
addNode(200,325);
addEdge(1,2,3);
addEdge(1,3,2);
addEdge(2,3,1);
addEdge(2,5,4);
addEdge(2,4,3);
addEdge(3,5,2);
addEdge(4,6,2);
addEdge(5,6,3);
source=1;
sink=6;
break;
case 3: addNode(10,200);
addNode(55,100);
addNode(55,300);
addNode(100,200);
Page 25 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
addNode(145,100);
addNode(145,300);
addNode(190,200);
addNode(235,100);
addNode(235,300);
addNode(280,200);
addNode(360,200);
addEdge(1,2,1);
addEdge(1,3,6);
addEdge(1,4,4);
addEdge(4,2,3);
addEdge(3,4,2);
addEdge(2,7,2);
addEdge(4,7,3);
addEdge(3,7,1);
addEdge(2,5,2);
addEdge(3,6,6);
addEdge(6,7,2);
addEdge(5,8,2);
addEdge(6,9,6);
addEdge(7,8,2);
addEdge(7,10,3);
addEdge(7,9,3);
addEdge(9,10,1);
addEdge(10,8,1);
addEdge(8,11,4);
addEdge(10,11,3);
addEdge(9,11,4);
source=1;
sink=11;
break;
case 4: addNode(10,200);
addNode(100,100);
addNode(100,300);
addNode(190,200);
addNode(275,100);
addNode(275,300);
addNode(360,200);
addEdge(1,2,5);
addEdge(1,4,3);
Page 26 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
addEdge(1,3,2);
addEdge(2,4,2);
addEdge(2,7,3);
addEdge(2,5,1);
addEdge(5,7,1);
addEdge(4,7,7);
addEdge(4,3,7);
addEdge(3,7,2);
addEdge(3,6,6);
addEdge(6,7,1);
source=1;
sink=7;
break;
case 5: addNode(20,185);
addNode(90,25);
addNode(90,105);
addNode(90,185);
addNode(90,265);
addNode(90,345);
addNode(300,40);
addNode(160,10);
addNode(230,360);
addNode(300,330);
addNode(370,185);
addEdge(1,2,3);
addEdge(1,3,6);
addEdge(1,4,9);
addEdge(1,5,6);
addEdge(1,6,3);
addEdge(2,7,5);
addEdge(8,2,3);
addEdge(2,9,5);
addEdge(10,2,3);
addEdge(7,3,3);
addEdge(3,8,4);
addEdge(9,3,3);
addEdge(3,10,4);
addEdge(4,7,2);
addEdge(8,4,1);
addEdge(4,9,2);
Page 27 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
addEdge(10,4,1);
addEdge(7,5,4);
addEdge(5,8,3);
addEdge(9,5,4);
addEdge(5,10,3);
addEdge(6,7,3);
addEdge(8,6,5);
addEdge(6,9,3);
addEdge(10,6,5);
addEdge(7,11,10);
addEdge(8,11,5);
addEdge(9,11,5);
addEdge(10,11,10);
source=1;
sink=11;
break;
case 6: addNode(170,150);
addNode(85,100);
addNode(30,200);
addNode(85,300);
addNode(305,100);
addNode(360,200);
addNode(305,300);
addNode(195,80);
addNode(195,320);
addNode(220,250);
addEdge(1,2,6);
addEdge(1,3,10);
addEdge(1,4,6);
addEdge(2,4,1);
addEdge(3,8,6);
addEdge(9,3,4);
addEdge(3,2,8);
addEdge(8,2,4);
addEdge(3,4,3);
addEdge(4,9,6);
addEdge(5,10,5);
addEdge(6,10,10);
Page 28 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
addEdge(7,10,5);
addEdge(7,5,1);
addEdge(5,6,4);
addEdge(7,6,6);
addEdge(8,6,3);
addEdge(6,9,5);
addEdge(9,7,7);
addEdge(5,8,7);
addEdge(8,9,10);
source=1;
sink=10;
break;
case 7: addNode(10,10);
addNode(380,10);
addNode(10,360);
addNode(380,360);
source=1;
sink=4;
break;
}
}
}
/////////////////
// class Graph //
/////////////////
public class Graph extends Applet {
GraphPanel panelGraph;
Page 29 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
int demo=0;
public void init() {
setLayout(new BorderLayout(5,5));
cbg.add("Change Position");
cbg.add("Add Node");
cbg.add("Remove Node");
cbg.add("Add Edge");
cbg.add("Remove Edge");
cbg.add("Change Capacity");
demono.add("Demo1");
demono.add("Demo2");
demono.add("Demo3");
demono.add("Demo4");
demono.add("Demo5");
demono.add("Demo6");
demono.add("Demo7");
panelControl1.add(cbg);
panelControl1.add(new Label(" "));
panelControl1.add(demono);
panelControl1.add(new Button("Schimba"));
panelControl2.add(caplabel);
panelControl2.add(cap);
panelControl2.add(new Label(" "));
panelControl2.add(new Button("Step"));
panelControl2.add(new Label(""));
panelControl2.add(new Button("Go"));
panelControl2.add(new Label(" "));
panelControl2.add(new Button("Init"));
panelControl2.add(flowlabel);
panelGraph.demo(0);
repaint();
}
Page 30 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
demo=demono.getSelectedIndex();
if ("Schimba".equals(arg)) {
panelGraph.reset();
panelGraph.initFlow();
panelGraph.mode = Mode.edit;
switch(demo){
case 0:panelGraph.demo(0);break;
case 1:panelGraph.demo(1);break;
case 2:panelGraph.demo(2);break;
case 3:panelGraph.demo(3);break;
case 4:panelGraph.demo(4);break;
case 5:panelGraph.demo(5);break;
case 6:panelGraph.demo(6);break;
};
repaint();
};
Page 31 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
if (panelGraph.edit != Mode.addedge)
if (panelGraph.from != 0) {
panelGraph.nodes[panelGraph.from].selected =
false;
panelGraph.from = 0;
panelGraph.repaint();
}
if ("Init".equals(arg)) {
panelGraph.initFlow();
panelGraph.mode = Mode.edit;
panelGraph.repaint();
return true;
}
if ("Step".equals(arg)) {
panelGraph.flowMax(panelGraph.source, panelGraph.sink);
return true;
}
if ("Go".equals(arg)) {
panelGraph.flowMax_go(panelGraph.source, panelGraph.sink);
return true;
}
return false;
}
}
Page 32 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Page 33 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Sursa C++
#include <stdio.h>
#include <values.h>
#include <math.h>
////////////////
// class Mode //
////////////////
struct {
int run;
int edit;
int move;
int addnode;
int delnode;
int addedge;
int deledge;
int capacity;
} Mode;
////////////////
// class Color //
////////////////
struct {
int black;
int cyan;
int red;
int pink;
int magenta;
int orange;
int blue;
} Color;
Page 34 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
////////////////
// class Node //
////////////////
class Node {
friend FF;
boolean selected;
boolean mark;
Node() {
selected=false;
mark=false;
};
};
////////////////
// class Edge //
////////////////
class Edge {
public:
friend FF;
int capacity;
boolean selected;
int min, max;
int flow;
boolean mark;
boolean exist() {
return (capacity > 0);
}
Edge(){
capacity = 0;
selected = false;
min=1;max=EDGE_MAX;
flow=0;
mark=false;
}
Page 35 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
}
};
//////////////
// class FF //
//////////////
class FF {
public:
int nnodes;
Node *nodes[MaxNode];
int source, sink, maxflow;
Edge *edges[MaxNode][MaxNode];
int mode;
int edit;
void reset();
int addNode() {
if (nnodes >= MaxNode -1) return -1;
Node *n = new Node();
nnodes++;
nodes[nnodes] = n;
sink = nnodes;
return nnodes;
};
FF();
void initFlow();
void removeEdgeMarks();
void display();
};
FF::FF() {
Page 36 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
void FF::reset() {
int i, j;
for (i=1;i<MaxNode;i++)
for (j=1;j<MaxNode;j++) {
edges[i][j]->capacity=0;
edges[i][j]->selected=false;
edges[i][j]->flow=0;
edges[i][j]->mark=false;
}
nnodes=0;
};
Page 37 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
}
nodes[u]->mark = false;
return res;
};
void FF::initFlow() {
maxflow=0;
for (int i = 1; i<= nnodes; i++)
for (int j = 1; j <= nnodes; j++)
edges[i][j]->flow = 0;
};
void FF::removeEdgeMarks(){
for (int i = 1; i<= nnodes; i++)
for (int j = 1; j <= nnodes; j++)
edges[i][j]->mark = false;
};
void FF::display(){
for (int i=1;i<=nnodes;i++){
for (int k=1;k<=nnodes;k++) printf("%d/%d ",edges[i][k]->flow,edges[i][k]-
>capacity);
printf("\n");
};
printf("\n");
};
//////////
// Demo //
//////////
class Demo{
public:
Demo();
};
Page 38 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
void Demo::Demo(){
FF myGraph;
myGraph.addNode();
myGraph.addNode();
myGraph.addNode();
myGraph.addNode();
myGraph.addNode();
myGraph.addNode();
myGraph.addEdge(1,2,3);
myGraph.addEdge(1,3,3);
myGraph.addEdge(2,4,2);
myGraph.addEdge(3,4,2);
myGraph.addEdge(2,3,1);
myGraph.addEdge(5,2,1);
myGraph.addEdge(3,5,1);
myGraph.addEdge(5,4,1);
myGraph.addEdge(5,6,3);
myGraph.addEdge(4,6,4);
myGraph.source=1;
myGraph.sink=6;
myGraph.initFlow();
myGraph.flowMax_go(myGraph.source, myGraph.sink);
myGraph.display();
};
void main(){
Demo demo;
};
Page 39 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Page 40 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
#include <stdio.h>
#include <values.h>
#include <math.h>
////////////////
// class Mode //
////////////////
struct {
int run;
int edit;
int move;
int addnode;
int delnode;
int addedge;
int deledge;
int capacity;
} Mode;
////////////////
// class Color //
////////////////
struct {
int black;
int cyan;
Page 41 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
int red;
int pink;
int magenta;
int orange;
int blue;
} Color;
////////////////
// class Node //
////////////////
template <class B>
class Node {
friend FF;
B selected;
B mark;
Node() {
selected=false;
mark=false;
};
};
////////////////
// class Edge //
////////////////
template <class T,class B>
class Edge {
public:
friend FF;
T capacity;
T flow;
B selected;
B mark;
boolean exist() {
return (capacity > 0);
}
Edge(){
capacity = 0;
selected = false;
flow=0;
Page 42 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
mark=false;
}
//////////////
// class FF //
//////////////
class FF {
public:
int nnodes;
Node<boolean> *nodes[MaxNode];
int source, sink, maxflow;
Edge<int,boolean> *edges[MaxNode][MaxNode];
int mode;
int edit;
void reset();
int addNode() {
if (nnodes >= MaxNode -1) return -1;
Node<boolean> *n = new Node<boolean>();
nnodes++;
nodes[nnodes] = n;
sink = nnodes;
return nnodes;
};
FF();
Page 43 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
void initFlow();
void removeEdgeMarks();
void display();
};
FF::FF() {
nnodes=0; source = 1; sink = 2; maxflow=0;mode =
Mode.edit;edit = Mode.move;
int i, j;
for (i=1;i<MaxNode;i++)
for (j=1;j<MaxNode;j++)
edges[i][j] = new Edge<int,boolean>();
};
void FF::reset() {
int i, j;
for (i=1;i<MaxNode;i++)
for (j=1;j<MaxNode;j++) {
edges[i][j]->capacity=0;
edges[i][j]->selected=false;
edges[i][j]->flow=0;
edges[i][j]->mark=false;
}
nnodes=0;
};
Page 44 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
if (res>0) {
e->mark = true;
e->flow +=res;
}
}
e = edges[v][u];
if (res==0 && e->exist() && e->flow > 0) {
res = FordFulkerson(thesink, v,minim(mont, e-
>flow));
if (res>0) {
e->mark = true;
e->flow -=res;
}
}
}
nodes[u]->mark = false;
return res;
};
void FF::initFlow() {
maxflow=0;
for (int i = 1; i<= nnodes; i++)
for (int j = 1; j <= nnodes; j++)
edges[i][j]->flow = 0;
};
void FF::removeEdgeMarks(){
for (int i = 1; i<= nnodes; i++)
for (int j = 1; j <= nnodes; j++)
edges[i][j]->mark = false;
};
void FF::display(){
Page 45 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
//////////
// Demo //
//////////
class Demo{
public:
Demo();
};
Demo::Demo(){
FF myGraph;
myGraph.addNode();
myGraph.addNode();
myGraph.addNode();
myGraph.addNode();
myGraph.addNode();
myGraph.addNode();
myGraph.addEdge(1,2,3);
myGraph.addEdge(1,3,3);
myGraph.addEdge(2,4,2);
myGraph.addEdge(3,4,2);
myGraph.addEdge(2,3,1);
myGraph.addEdge(5,2,1);
myGraph.addEdge(3,5,1);
myGraph.addEdge(5,4,1);
myGraph.addEdge(5,6,3);
myGraph.addEdge(4,6,4);
myGraph.source=1;
myGraph.sink=6;
myGraph.initFlow();
myGraph.flowMax_go(myGraph.source, myGraph.sink);
myGraph.display();
Page 46 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
};
void main(){
Demo demo;
};
Page 47 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Referinte
Page 48 of 49
Algoritmul Ford-Fulkerson Sorin OSTAFIEV – grupa 331CA
Page 49 of 49