C++实现最短路径算法
#include <iostream>
#include <iomanip>
#define int_max 5000
#define max_ver 20
typedef enum { dg, dn, udg, udn } graphkind;
typedef struct arccell
{
int adj;
//infotype *info;
}arc, adjmat[max_ver][max_ver];
typedef struct
{
char vexs[max_ver];
adjmat arcs;
int vexnum, arcnum;
graphkind kind;
}mgraph;
typedef struct
{
char adjvex;
int lowcost;
}closedge[max_ver];
typedef struct
{
bool b;
int n;
}msp;
msp p[27][27][27];
int d[27][27];
using namespace std;
int locatevex(mgraph g, char v)
{
int i;
for (i = 0; i < g.vexnum; i++)
{
if (g.vexs[i] == v) return i;
}
return -1;
}
void print(mgraph g)
{
cout << "输出的最短路径依次为:" << endl;
int i, j, k, f;
for (i = 0; i < g.vexnum; i++)
for (j = 0; j < g.vexnum; j++)
{
if (d[i][j] < int_max)
{
if (g.vexnum == 3)
{
cout << " 权值:" << setw(3) << d[i][j] <<" ;";
cout << " 边 :" << g.vexs[i];
k = 0;
while (k < g.vexnum)
{
if (k != i && k != j && p[i][j][k].b == true)
{
cout << " -> " << g.vexs[k];
break;
}
k++;
}
cout << " -> " << g.vexs[j] << endl << endl;
}
else
{
f = 0;
cout << " 边 :" << g.vexs[i] << "->" << g.vexs[j] << " " << endl;
cout << " 对应的权值: " << setw(4) << d[i][j] << endl;
cout << " 经历的各个顶点 : ";
for (k = 0; k < g.vexnum; k++)
{
if (k != i && k != j && p[i][j][k].b == true)
{
cout << " " << g.vexs[k];
f = 1;
}
}
if (f == 0) cout << " 无";
cout << endl << endl;
}
}
}
}
void createudn(mgraph& g)
{
char v1, v2;
int m, i, j, k;
cout << "请输入图的顶点个数和边数:";
cin >> g.vexnum >> g.arcnum;
cout << "请输入各顶点所代表的字符:";
for (i = 0; i < g.vexnum; i++)
cin >> g.vexs[i];
for (i = 0; i < g.vexnum; i++)
for (j = 0; j < g.vexnum; j++)
g.arcs[i][j].adj = int_max;
for (k = 0; k < g.arcnum; k++)
{
cout << "请输入起点(字符)和终点(字符)及其对应的边的权值:";
cin >> v1 >> v2 >> m;
i = locatevex(g, v1);
j = locatevex(g, v2);
g.arcs[i][j].adj = m;
}
cout << "图的邻接矩阵为:" << endl;
for (i = 0; i < g.vexnum; i++)
{
for (j = 0; j < g.vexnum; j++)
cout << setw(9) << g.arcs[i][j].adj << " ";
cout << endl;
}
return;
}
void floyd(mgraph g)
{
int i, j, k, l;
for (i = 0; i < g.vexnum; i++)
for (j = 0; j < g.vexnum; j++)
{
d[i][j] = g.arcs[i][j].adj;
for (k = 0; k < g.vexnum; k++)
p[i][j][k].b = false;
if (d[i][j] < int_max)
{
p[i][j][i].b = true;
p[i][j][j].b = true;
}
}
for (i = 0; i < g.vexnum; i++)
for (j = 0; j < g.vexnum; j++)
for (k = 0; k < g.vexnum; k++)
{
if (d[j][i] + d[i][k] < d[j][k])
{
d[j][k] = d[j][i] + d[i][k];
p[j][k][i].b = true;
for (l = 0; l < g.vexnum; l++)
{
p[j][k][l].b = p[j][i][l].b || p[i][k][l].b;
}
}
}
}
int main()
{
mgraph g;
char u;
cout << "开始构造有向图" << endl;
createudn(g);
cout << endl << "开始运用弗洛里德思想求最短路径" << endl;
floyd(g);
print(g);
return 0;
}
专心看人间!
浙公网安备 33010602011771号