分支限界法单源最短路径
分支限界法单源最短路径 #包含iostream > <
使用名称空间;
#定义最大9999 / /定义无穷大
/ *
*图类,用以存放有关图的所有信息
* /
类图
{
公共:
/ / ---------------------------
/ /参数int初始节点编号
/ / --------------------------
无效shorestpaths(int);
无效showdist();
graph();
私人:
int n;//图的节点个数
int * / /存放顶点的前驱节点沪指;
int * C;/ /存放图的邻接矩阵
int *区;/ /存放源点到各个顶点的距离
};
/ *
*节点
* /
类minheapnode
{
朋友图;
公共:
int返回我geti() {;}
无效的SETI(int II)
{
I = II;
}
getlength() { int返回长度;}
无效的
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
长度(len)
{
长度=透镜;
}
私人:
int i;//顶点编号
int长度;/ /当前路长
};
/ *
*最小堆
* /
类minheap
{
朋友图;
公共:
minheap();
minheap(int);
DeleteMin(minheapnode &)无效;
插入(minheapnode);
布尔outofbounds();
私人:
int的长度;
minheapnode *结;
};
图::graph()
{
int = 0;
int = 0;
cout <<“请输入图的节点个数:”;
CIN;
cout <<“请输入图的邻接矩阵:(无穷大请以9999代替)“<< endl;
c =新int * n + 1 ];
距离=新国际[ n + 1 ];
沪指=新国际[ n + 1 ];
/ / ------------------------------
/ /初始化邻接矩阵
/ / ------------------------------
对于(WI = 0;WI = n;WI + +)
{
c =新的int [ n + 1 ];
如果(WI = 0)
{
因为(易= 0;易;
{
[易] = 0;
}
}
其他的
{
因为(易= 0;易;
{
如果(= = 0)
{
[易] = 0;
}
其他的
{
[易];
}
}
}
}
/ / ----------------------------------
/ /初始化数组
/ / ----------------------------------
对于(WI = 0;WI = n;WI + +)
{
[取消] =最大距离;
沪指[无线] = 0;
}
}
图:showdist()无效:
{
cout <<“从源点到该节点的最短路径:“<< endl;
int = i 0;
int = 0;
对于(i = 1;i = n;i + +)
{
cout <<“dist [“<<我<<”] =“<<区[我] << endl;
}
cout <<“从源点到终点的最短路径长度为:“<< dist [N] << endl;
cout <<“其路径为:”;
温度= n;
而(临时)~= 0)
{
如果(沪指[温度] = = 0)
{
cout <<(临时);
}
其他的
{
cout <<(临时)<<“<”;
}
温度=沪指[温度];
}
cout << endl;
}
图:ShorestPaths:无效(int V)
{
minheap h(n);/ /最小堆
minheapnode E;/ /扩展节点
E. = V;
e.length = 0;
距离[五] = 0;
/ /搜索问题的解空间树
虽然(真实)
{
int = 0;
对于(j,1;j,n;j + +)
{
cout <<“C [“<<即<<”] [“<< J <<”] =“<< C [即] [ J ] << endl;
如果((C [即] [ J ]~= max)和(C [即] [ J ]~= 0)
{
/ /节点控制关系
如果(e.length + C [即] [ J ] <区[ J ])
{
距离[ J ] = e.length + C [即] [ J ];
沪指[ J ] = E.;
/ /加入活结点优先队列
/ /若节点为叶子节点,则不加入活结点队列
如果(j)~= n)
{
minheapnode n;
n.i = J;
n.length =分布[J].;
H.Insert(N);
}
}
其他的
{
H.DeleteMin(E);
}
}
}
如果(H. outofbounds())
{
打破;
}
cout <<“上一个扩展节点”<<即<<”<< e.length << endl;
H.DeleteMin(E);
cout <<“下一个扩展节点”<<即<<”<< e.length << endl;
}
}
MinHeap::minheap()
{
长度= 10;
节点=新minheapnode [长度+ 1 ];
对于(int = i 0;i =长度;i + +)
{
结[我]的SETI(0);
结[我]规定长度(0);
}
}
MinHeap::MinHeap(int n)
{
长度= n;
节点=新minheapnode [长度+ 1 ];
对于(int = i 0;i =长度;i + +)
{
结[我]的SETI(0);
结[我]规定长度(0);
}
}
/ *
*取下一个扩展结点,并删除此节点
*算法实现其实是用下一个节点的信息替代现有节点的数据
*首先在现有的节点中,找出长度最短的节点
*然后将此节点的数据替换原有的数据
* /
无效minheap::DeleteMin(minheapnode & E)
{
int = i 0;
int = 0;
J = E /用来删除原来的扩展节点geti();
结[J]。SETI(0);//置零
结[J]。规定长度(0);//置零
int =最大值;
/ / -------------------------------------
/ /选择可扩展节点中长度域最小的可扩展节点
/ /将所选择的扩展节点的数值替换原有的扩展节
/ /点的值,最后在可扩展节点队列中删除原扩展
/ /节点,删除方式为:所有域置零
/ / -------------------------------------
对于(i = 1;i =长度;i +)
{
如果((结[我]。getlength() <温度)和(节点getlength() [我]~
= 0)
{
E.setI(我);
E.setLength(结[我]。getlength());
温度=结[我]。getlength();/ /温度中始终为最小值
}
}
}
/ *
*加入最小堆
*此处添加按节点编号添加,即对应的节点编号添加时
*对应队列中相应的编号,即节点5则添加到队列中5号
*位置
* /
无效minheap::插入(minheapnode N)
{
[例句]节点geti() SETI(N. geti());
[例句]节点geti()规定长度(N getlength());
}
/ *
*判断最小堆是否为空
* /
布尔minheap::outofbounds()
{
int = i 0;
布尔标志为真;
对于(i = 1;i =长度;i +)
{
如果(节点geti() [我]~= 0)
{
标志=假;
}
}
返回标志;
}
国际main()
{
图;
图shorestpaths(1);
showdist()图;
返回0;
}
/ *
输入节点数为5
输入邻接矩阵为:{ 0, 2,9999,1,4
9999,0,5, 2, 9999
99999999 ,2,5, 9999
999999999999 ,0,2
9999999999999999 ,0 }
* /