📄 p284.cpp
字号:
#include "iostream.h"
#include "assert.h"
const int NumVertices = 6; //图中最大顶点个数
const int MAXINT=32767;
class Graph { //图的类定义
private:
int n;
int Edge[NumVertices][NumVertices]; //图的邻接矩阵
int dist[NumVertices]; //存放从顶点0到其它各顶点的最短路径长度
int path[NumVertices]; //存放在最短路径上该顶点的前一顶点的顶点号
int S[NumVertices]; //已求得的在最短路径上的顶点的顶点号
public:
void ShortestPath ( const int );
int choose ( const int );
void BestPath(ostream& os);
void BellmanFord ( const int v );
friend istream& operator >>(istream& strm, Graph & g);
};
void Graph::ShortestPath ( const int v ) {
//G是一个具有n个顶点的带权有向图, 各边上的权值由Edge[i][j]给出。本算法建立起一个数组: dist[j], 0 < j < n,
//是当前求到的从顶点v到顶点j的最短路径长度, 同时用数组path[j], 0 < j < n, 存放求到的最短路径。
assert(((v<n) &&(v>=0)));
for ( int i=0; i<n; i++) { // dist和path数组初始化
dist[i] = Edge[v][i]; //邻接矩阵第v行元素复制到dist中
S[i] = 0; //已求出最短路径的顶点集合初始化
if ( i != v && dist[i] < MAXINT ) path[i] = v;
else path[i] = -1; //路径存放数组初始化
}
S[v] = 1; dist[v] = 0; //顶点v加入顶点集合
for ( i=0; i<n-1; i++ ) { //从顶点v确定n-1条路径
int min = MAXINT;
int u = v;
for ( int j=0; j<n; j++ ) //选择当前不在集合S中具有最短路径的顶点u
if ( !S[j] && dist[j] < min ) { u = j; min = dist[j]; }
S[u] = 1; //将顶点u加入集合S, 表示它已在最短路径上
for ( int w=0; w<n; w++ ) //修改
if ( !S[w] && Edge[u][w] < MAXINT && dist[u] + Edge[u][w] < dist[w] ) {
dist[w] = dist[u] + Edge[u][w]; path[w] = u;
}
}
}
istream& operator >>(istream& strm, Graph & g)
{
strm>>g.n;
for (int i=0;i<g.n;i++)
{
for (int j=0;j<g.n;j++)
{
strm>> (g.Edge[i][j]);
}
}
return strm;
}
void Graph::BestPath(ostream& os)
{
os<<"shortest dist:";
for (int i=0;i<n;i++)
{
os<<dist[i]<<" ";
}
os<<endl;
os<<"shortest path:";
for ( i=0;i<n;i++)
{
os<<path[i]<<" ";
}
os<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -