@【数据结构】(最短路径-Dijksatra算法)
有向图带权值的存储结构,求每个顶点的入度和出度,并实现求最短路径的Dijksatra算法
最短路径子函数:
void closestpath(MGraph G, int v)
{
int dist[MAX]; // 保存源点v到顶点i的目前最短路径长度
int path[MAX][MAX]; //保存源点到顶点j的最短路径,实际上为最短路径上的前一个顶点u
int S[MAX]; // 顶点集
double min;
int i, j, u = 0;
for (i =0; i <= G.n; i++)
{
dist[i] = G.edges[v][i]; //距离初始化
S[i] = 0;
for (j = 0; j < G.n; j++)
path[i][j] = -1;
if (G.edges[v][i] < INF) //有直接路径
{
path[i][0] = v;
path[i][1] = i;
} // 有边时,置i前一顶点为v
}
S[v] = 1; //源点编号v放入S中
for (i = 1; i < G.n; i++) // 其余n-1个顶点
{
min = INF;
for (j = 0; j < G.n; j++)
if (S[j] == 0 && dist[j] < min) //寻找顶点i到其他点中最短的路径
{
u = j;
min = dist[j];
}
S[u] = 1; //顶点u加入S中
//修改不在s中的顶点的距离
for (j = 0; j < G.n; j++)
if (S[j] == 0)
if (G.edges[u][j]<INF && min + G.edges[u][j] < dist[j]) // 间接路径长度小于直接路径
{
dist[j] = min + G.edges[u][j];
for (int w = 0; w < G.n; w++)
{
path[j][w] = path[u][w];
if (path[j][w] == -1)
{
path[j][w] = j;
break;
}
}
}
}
for(i=1;i<G.n;i++)
if (i != 0 && dist[i] != INF)
{
cout << G.vexs[0] << "-" << G.vexs[i] << "的最短路径长度为" << dist[i];
cout << "最短路径为:";
for (j = 0; j < G.n; j++)
{
if (path[i][j] > -1)
cout <<G.vexs[path[i][j]] << " ";
}
cout << endl;
}
else if (dist[i] == INF)
cout << G.vexs[0] << "-" << G.vexs[i] << "不可达" << endl;
}
求度子函数:
void Degree(MGraph G)
{
//有向图的邻接矩阵第i行非零元素的个数为第i个结点的出度
//有向图的邻接矩阵第j列非零元素的个数为第i个结点的入度
int i, j;
for (i = 0; i < G.n; i++)
{
int out = 0;
for (j = 0; j < G.n; j++)
{
if (G.edges[i][j] != INF)
out++;
}
cout << "第" << i << "个结点"<<G.vexs[i]<<"的出度为" << out << endl;
}
cout << endl;
for (j = 0; j < G.n; j++)
{
int in = 0;
for (i = 0; i < G.n; i++)
{
if (G.edges[i][j] != INF)
in++;
}
cout << "第" << j << "个结点" << G.vexs[j] << "的入度为" <<in << endl;
}
cout << endl;
}
测试:
建立有向带权图:
求入度与出度:
最短路径: