问题描述
给定一个带权有向图G=(V,E),其中每条边的权是一个正整数。
另外,还给定V中的一个顶点v,称为源点。计算从源点到其他所有顶点的最短路径长度。这里的长度是指路上各边权之和。
采用队列式分枝限界法求解
队列结点类型声明如下:
struct NodeType //队列结点类型
{ int vno; //顶点编号
int length; //路径长度
};
用dist数组存放源点v出发的最短路径长度,dist[i]表示源点v到顶点i的最短路径长度,初始时所有dist[i]值为∞。
用prev数组存放最短路径,prev[i]表示源点v到顶点i的最短路径中顶点i的前驱顶点。
代码
int n;
int a[MAXN][MAXN];
int v;
int dist[MAXN];//存放原点到顶点i的最短路径长度
int prev[MAXN];//原点到j的最短路径中j的前驱节点
struct NodeType
{
int vno;//顶点编号
int length;//路径长度
};
void bfs(int v)
{
NodeType e,e1;
queue<NodeType> pqu;
e.vno=v;
e.length=0;
pqu.push(e);
dist[v]=0;
while(!pqu.empty())
{
e=pqu.front();
pqu.pop();
for(int j=0;j<n;j++)
{
if(a[e.vno][j]<INF&&e.length+a[e.vno][j]<dist[j])
{
dist[j]=e.length+a[e.vno][j];
prev[j]=e.vno;
e1.vno=j;
e1.length=dist[j];
pqu.push(e1);
}
}
}
}
采用优先队列式分枝限界法求解
采用STL的priority_queue< NodeType >容器作为优先队列(小根堆),优先队列结点类型与前面的相同,添加比较重载函数,即按结点的length成员值越小越优先出队,为此设计NodeType结构体的比较重载函数如下:
bool operator<(const NodeType & node) const
{
return length>node.length; //length越小越优先出队
}
代码
int n;
int a[MAXN][MAXN];
int v;
int dist[MAXN];//存放原点到顶点i的最短路径长度
int prev[MAXN];//原点到j的最短路径中j的前驱节点
struct NodeType
{
int vno;//顶点编号
int length;//路径长度
bool operator<(NodeType & node) const
{
return length>node.length;
}
};
void bfs(int v)
{
NodeType e,e1;
priority_queue<NodeType> pqu;
e.vno=v;
e.length=0;
pqu.push(e);
dist[v]=0;
while(!pqu.empty())
{
e=pqu.front();
pqu.pop();
for(int j=0;j<n;j++)
{
if(a[e.vno][j]<INF&&e.length+a[e.vno][j]<dist[j])
{
dist[j]=e.length+a[e.vno][j];
prev[j]=e.vno;
e1.vno=j;
e1.length=dist[j];
pqu.push(e1);
}
}
}
}