B).对于弧(vi,vj),若fji>0,则给vj标号(-vi,0),vj点成为标号而未检查的点。
然后找到下一个标号而未检查的点,重复上述步骤,一旦vt被标上号,表明得到一条从vi到vt的增广路径p,转入调整过程。
若所有标号都已检查过去,而标号过程进行不下去时,则算法结束,这时的可行流就是最大流。
(2)调整过程
从vt点开始,通过每个点的第一个标号,反向追踪(根据结点的From信息),可找出增广路P。
直到vs为止。
这时整个增广路径就找到了。
在上述找增广路径的同时计算调整值:
min{min(cij-fij),min(fij)}
C、算法运行结果如下:
五、实验总结
由于所求为边连通度,只需要根据最大流的算法加以改之就可以用来求边连通度,即将图中的容量改为1,然后求出来的每个顶点到其他任意顶点的最大流,进而所有的最大流中的最小值即为该图的边连通度。
只要掌握这个要点,那么边连通度就能轻易的求出来。
没有什么难度在里面。
六、源代码
//图的顶点结构如下:
//-----------------------------------
//|vex|formerNode|flowsDiff|mark|
//-----------------------------------
//图的边的结构如下:
//----------------
//|weight|flows|
//----------------
#include
#include
#include
usingnamespacestd;
#defineMax_vex100
#defineM1000
//SetTextC1是原来的颜色
//SetTextC2是设置的输出输入颜色
#defineSetTextC1SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE)
#defineSetTextC2SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN)
#defineSetTextC3SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE)
#defineSetTextC4SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED)
#defineSetTextC5SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE)
#defineSetTextC6SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE)
#defineSetTextC7SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN)
classArcll{//边上值
public:
doubleweight;//容量
doubleflows;//流量
};
enumMark{n_mark,marking,h_marked};//分别代表没有标记,已经标记_未检查,已经标记_检查
classVex{//顶点值
public:
stringvexs;//顶点名称
stringformerVex;
doubleflowsDiff;//流量的差值且最小
Markmark;
};
classGraphics{//创建一个图的类
private:
intvexnum;//顶点数
intarcnum;//边数
Vexvexs[Max_vex];//存储定点名称
Arcllarcs[Max_vex][Max_vex];//边数
public:
voidCreateGraphics(Graphics&G);//创建一个图
intLocateIndex(GraphicsG,stringv);//寻找下标
doubleMark_getMaxstream(Graphics&G,intp,intq);
boolMark_FindMaxstream(Graphics&G,intp,intq);//标号法寻找最大流
boolMark_Node(Graphics&G,inti);//标记的方法
intCheckMarkNode(Graphics&G,inti);
voidConnectedDegree(Graphics&G);
};
//方法实现
//找到相应顶点的下标
intGraphics:
:
LocateIndex(GraphicsG,stringv){
inti=0;
for(i=0;iif(G.vexs[i]pare(v)==0){
returni;
}
}
return-1;
}
//创建一个有向图
voidGraphics:
:
CreateGraphics(Graphics&G){
inti,j,k;
stringVi,Vj;
SetTextC1;
cout<<"-------------------------创建无向图的存储-------------------------------"<cout<<"请输入顶点数:
";
SetTextC4;//设置颜色
cin>>G.vexnum;
SetTextC1;//设置颜色
cout<<"请输入图的边数:
";
SetTextC4;
cin>>G.arcnum;
SetTextC1;
cout<<"请输入顶点名:
";
SetTextC4;
for(i=0;icin>>G.vexs[i].vexs;
}
SetTextC1;
for(i=0;ifor(j=0;jG.arcs[i][j].weight=M;
G.arcs[i][j].flows=-1;
}
}
for(k=0;kcout<<"请输入第"<";
SetTextC4;
cin>>Vi>>Vj;
SetTextC1;
i=LocateIndex(G,Vi);
j=LocateIndex(G,Vj);
if(i==-1||j==-1){
cout<<"输入错误!
请检查..."<return;
}
G.arcs[i][j].weight=1;//将一条边(i,j)分解成两条弧(i,j)(j,i)
G.arcs[i][j].flows=0;
G.arcs[j][i].weight=1;
G.arcs[j][i].flows=0;
}
cout<cout<<"各顶点的关系:
"<SetTextC2;
for(i=0;iif(i==0){
cout<<"\t\t"<}else{
cout<<"\t"<}
}
cout<SetTextC3;
for(i=0;iSetTextC2;
cout<<"\t"<SetTextC3;
for(j=0;jif(G.arcs[i][j].weight==M){
SetTextC6;
cout<<"\t"<<